从零开始,做一个NodeJS博客(一):Heroku上的最简NodeJS服务器
标签: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="en">
<head>
<meta charset="UTF-8">
<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 "/tmp/build_7f369635973e963166afa93b918df0b4/Rocket1184-NodeServerTest-8575934/.heroku/node/bin/node" "/tmp/build_7f369635973e963166afa93b918df0b4/Rocket1184-NodeServerTest-8575934/.heroku/node/bin/npm" "install" "--unsafe-perm" "--userconfig" "/tmp/build_7f369635973e963166afa93b918df0b4/Rocket1184-NodeServerTest-8575934/.npmrc"
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+/):
// "dependencies": {
// "fs": "3.x",
// "http": "3.x"
// },
好了,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仓库的实时构建结果。
从零开始,做一个NodeJS博客(一):Heroku上的最简NodeJS服务器的更多相关文章
- 这几天有django和python做了一个多用户博客系统(可选择模板)
这几天有django和python做了一个多用户博客系统(可选择模板) 没完成,先分享下 断断续续2周时间吧,用django做了一个多用户博客系统,现在还没有做完,做分享下,以后等完善了再慢慢说 做的 ...
- 基于hexo+github搭建一个独立博客
一直听说用hexo搭建一个拥有自己域名的博客是很酷炫的事情~,在这十一花上半个小时整个hexo博客岂不美哉. 使用Hexo吸引我的是,其简单优雅, 而且风格多变, 适合程序员搭建个人博客,而且支持多平 ...
- 前端设计师也有必要学习seo,推荐一个seo博客
做前端设计师有一段时间了,现在越来越觉得作为一个前端设计师,必须要懂一些seo的知识. 因为公司的seo们,总是在网站做好以后,提出各种各样的网站修改的需求. 如果前端设计师,能够了解一些基本的seo ...
- 如何搭建一个独立博客——简明Github Pages与Hexo教程
摘要:这是一篇很详尽的独立博客搭建教程,里面介绍了域名注册.DNS设置.github和Hexo设置等过程,这是我写得最长的一篇教程.我想将我搭建独立博客的过程在一篇文章中尽可能详细地写出来,希望能给后 ...
- 使用前端技术和MySQL+PHP制作自己的一个个人博客网站
源代码地址:https://github.com/YauCheun/BlogCode 我的博客网站地址:http://www.yublog.fun/ 制作前景: 想拥有一个自己独自开发的一个小型博客网 ...
- 怎么在阿里云搭建一个WordPress博客(超详细教程)
想以正确的方式启动一个 WordPress 博客吗?我知道,这可能是一个令人恐惧的想法 -- 其实你并不孤单.但是,在帮助很多用户创建博客之后,我决定编写一份详细的指南,让任何没有技术知识的人都能拥有 ...
- 做个开源博客学习Vite2 + Vue3 (一)搭建项目
前言 不会 webpack,遇到报错就一头雾水,完全不知道怎么办,而且体积还大速度还慢. 所以尤雨溪做了 vite 后就很向往,只是知道自己水平有限还是等大佬先趟趟坑,等差不多了在跳. 现在vite2 ...
- Vue.js 入门:从零开始做一个极简 To-Do 应用
Vue.js 入门:从零开始做一个极简 To-Do 应用 写作时间:2019-12-10版本信息:Vue.js 2.6.10官网文档:https://cn.vuejs.org/ 前言 学习 Vue ...
- 使用GitHub-Pages创建博客和图片上传问题解决
title: 使用GitHub Pages创建博客和图片上传问题解决 date: 2017-10-22 20:44:11 tags: IT 技术 toc: true 搭建博客 博客的搭建过程完全参照小 ...
随机推荐
- web接口测试之GET与POST请求
关于HTTP协议,我考虑了一下觉得没必要再花一节内容来介绍,因为网上关于HTTP协议的介绍非常详细.本着以尽量避免介绍一空洞了概念与理论来介绍接口测试,我这里仍然会给出具体实例. 在此之前先简单的介绍 ...
- Linux - Tips
01 - Linux的系统结构 Linux 系统结构详解 02 - 执行多条命令 方法1:在命令行下可以一次性粘贴多条语句,shell会依次执行并输出结果 方法2:在一个命令行中,用分号将各个命令隔开 ...
- SQL Server时间粒度系列----第2节日期、周时间粒度详解
本文目录列表: 1.从MySQL提供的TO_DAYS和FROM_DAYS这对函数说起2.SQL Server日期时间粒度3.SQL Server周有关时间粒度 4.总结语 5.参考清单列表 从My ...
- STM32L系列单片机内部EEPROM的读写
STM32L系列单片机内部提供了EEPROM存储区域,但实质上,其FLASH也是EEPROM类型,只不过有一块区域被开放出来专门用作EEPROM操作而已.STM32L的EEPROM使用寿命设计为100 ...
- 【转】 Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- ADB pm 命令
usage: pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_TER] pm list permission-grou ...
- 使用DevExpress官方汉化文件对界面进行汉化的过程
在较早期的Dev开发中,基本上都是在使用一个DLL包的汉化文件,如基于13.1的汉化包文件Dxper.LocalizationCHS.Win.v13.1.5.dll,这个汉化包也比较方便,大多数时候复 ...
- C# ACCESS数据库操作类
这个是针对ACCESS数据库操作的类,同样也是从SQLHELPER提取而来,分页程序的调用可以参考MSSQL那个类的调用,差不多的,只是提取所有记录的数量的时候有多一个参数,这个需要注意一下! usi ...
- C++ VS2012 内存泄露检测
在VS2012中添加部分代码,可以起到检测内存泄露的作用. 今天刚刚收到的解决办法,原理还不是很清楚.先分享出来 1. 头文件中添加以下代码 #ifdef _DEBUG #define DEBUG_C ...
- C#编程总结(五)多线程带给我们的一些思考
C#编程总结(五)多线程带给我们的一些思考 如有不妥之处,欢迎批评指正. 1.什么时候使用多线程? 这个问题,对于系统架构师.设计者.程序员,都是首先要面对的一个问题. 在什么时候使用多线程技术? 在 ...