设为首页 收藏本站
查看: 1100|回复: 0

[经验分享] 从零开始,做一个NodeJS博客(一):Heroku上的最简NodeJS服务器

[复制链接]

尚未签到

发表于 2017-2-24 10:20:29 | 显示全部楼层 |阅读模式
  标签:NodeJS,Heroku

0
  这里是这个伪系列的第一篇,因为我也不知道自己能不能做完,然后到底能做成什么样子。总之,尽力而为吧,加油。

1 Heroku App 的构成
  Heroku 所谓的 NodeJS App ,看起来像一个npm模块,需要一个package.json,语法也跟npm模块的语法几乎一样。
  
需要在里面写明运行的Node版本及npm版本,以及需要的其他模块依赖及版本。
  必须的几个文件:


  • package.json //定义引擎及依赖
  • Procfile //告诉Heroku,App所需要的权限(网络什么的),运行什么命令启动你的App
  • server.js //总得有个JS文件才能跑吧,不过不限制名字
  package.json:
{  "name": "blog-node",
  "version": "1.0.0",
  "description": "rocka's node blog",
  "engines": {
  "node": "6.3.1",
  "npm": "3.10.3"
  },
  "main": "server.js",
  "scripts": {
  "start": "node server.js"
  },
  "repository": {
  "type": "git",
  "url": "git+https://github.com/Rocket1184/NodeServerTest.git"
  },
  "author": "r0cka",
  "license": "MIT"
  
}
  Procfile:
  

web: node server.js  

1 开始写服务器
  我对这个服务器没什么大要求,只要能返回个404页面就行。相当于一个HelloWorld。
  
所以我们先需要一个404页面,404.html:
<!DOCTYPE html>  
<html lang=&quot;en&quot;>
  
<head>
  <meta charset=&quot;UTF-8&quot;>
  <title>Error: Not Found</title>
  <style>
  h1,
  p {
  text-align: center;
  }
  </style>
  
</head>
  
<body>
  <h1>Error: 404 Not Found</h1>
  <p>File not exist, please check your url.</p>
  <hr>
  <p>Node.js - v6.3.1</p>
  
</body>
  
</html>
  没啥好说的,一个随随便便的404就好。
  然后开始接收请求,准备返回404页面了~~~
  这里贴上我的 server.js:
'use strict';  

  
var http = require('http');
  
var fs = require('fs');
  

  
var server = http.createServer((request, response) => {
  console.log(request.method + ': ' + request.url);
  if (request.method === 'GET') {
  if (request.url === '/favicon.ico') {
  fs.createReadStream('./favicon.ico').pipe(response);
  } else {
  response.writeHead(200, { 'Content-Type': 'text/html' });
  fs.createReadStream('./404.html').pipe(response);
  }
  }
  
});
  

  
var serverPort = process.env.PORT || 5000;
  

  
server.listen(serverPort);
  

  
console.log(`[Rocka Node Server] Running at http://127.0.0.1:${serverPort}/`);
  用自带的http API创建服务器,处理请求:
  
如果是GET请求,而且想要拿到 /favicon.ico ,那么用 fs 模块把文件读出来,通过管道传给响应。
  
否则读取 404.html,把他传出去。
  值得注意的一点是,Heroku会为你的App动态分配,端口。如果把服务器监听的端口写死
server.listen(8080);  构建成功,但几乎肯定会出现这个错误:
  

Web process failed to bind to $PORT within 60 seconds of launch  

  所以,把端口的值改成Heroku API提供的动态值 process.env.PORT 就好了~~

2 package.json 的一个坑
  因为缺乏对npm的了解,我在这一步犯了一个看起来非常小白的错误:
  
由于我在使用node写服务器时,引用了node自带的fs和http模块,就以为写依赖的时候要把这些也写进去。于是Heroku构建时就各种报错,构建失败:
  

   npm ERR! Linux 3.13.0-91-generic  npm ERR! argv &quot;/tmp/build_7f369635973e963166afa93b918df0b4/Rocket1184-NodeServerTest-8575934/.heroku/node/bin/node&quot; &quot;/tmp/build_7f369635973e963166afa93b918df0b4/Rocket1184-NodeServerTest-8575934/.heroku/node/bin/npm&quot; &quot;install&quot; &quot;--unsafe-perm&quot; &quot;--userconfig&quot; &quot;/tmp/build_7f369635973e963166afa93b918df0b4/Rocket1184-NodeServerTest-8575934/.npmrc&quot;
  npm ERR! node v6.3.1
  npm ERR! npm  v3.10.3
  npm ERR! No compatible version found: fs@3.10.3
  npm ERR! Valid install targets:
  npm ERR! 0.0.2, 0.0.0
  npm ERR!
  npm ERR!
  npm ERR! If you need help, you may report this error at:
  npm ERR!     <https://github.com/npm/npm/issues>
  npm ERR! Please include the following file with any support request:
  npm ERR!     /tmp/build_7f369635973e963166afa93b918df0b4/Rocket1184-NodeServerTest-8575934/npm-debug.log
  

  起初我以为是自己的版本写的不对,就一再的修改fs和http的版本号,从3.10.3到3.x再到>=0.0.1,依旧构建失败。
  
一直构建不过,肯定是哪里出了问题。于是来看看自己本地的这些模块的版本号:
  

$ npm ls  
node-server-test@1.0.0 D:\Documents\GitHub\NodeServerTest
  
`-- (empty)
  

  这里面的模块是空的!!!
  
废话,什么都没装,当然是空的。
  
我立马在package.json里面注释掉了这些东西(VSCode里面潇洒的一个Ctrl+/):
// &quot;dependencies&quot;: {  
//   &quot;fs&quot;: &quot;3.x&quot;,      
  
//   &quot;http&quot;: &quot;3.x&quot;      
  
// },
  好了,commit,push,deploy,纳尼!!居然又报错了!!!
  

-----> Node.js app detected  
parse error: Invalid numeric literal at line 12, column 5
  !     Unable to parse package.json
  
-----> Build failed
  

  啊,JSON里面不能加注释啊。。。。好了,删掉,重跑,总算成功了。

仓库地址

GitHub仓库:BlogNode

  主仓库,以后的代码都在这里更新。


HerokuApp:rocka-blog-node

  上面GitHub仓库的实时构建结果。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346509-1-1.html 上篇帖子: Nodejs进阶:如何玩转子进程(child_process) 下篇帖子: Nodejs与ES6系列4:ES6中的类
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表