开发 node 程序有一些必须掌握的技巧,这里收集一些我遇到的问题和解决方案。
有些工具对 node 的版本有硬性要求,在各个工具中来回切换的时候也需要在 node 的版本之间来回切换,这里介绍一个 node 的版本管理模块 n(这名字可够短的...),是专门用来管理node.js的版本的。
首先安装n模块:
npm install -g n
查看本地安装了那些版本的 node
n
// 上下键切换版本,回车确认
升级node.js到最新稳定版,尾号为双数的版本是稳定版
n stable
列出所有可用的 node 版本
n ls
安装特定版本
n 6.2.0
Web开发使用 inspector
插件在chrome中调试。win7下命令行运行 npm install -g node-inspector
安装,mac下如果用上面命令可能存在权限问题,如果出现错误无法安装,尝试 sudo npm install -g node-inspector
并输入登录密码,输密码时只有一个光标闪,但你可能已经输入了,一口气输完然后回车。
启动调试的命令是 node-debug 你的程序入口
,如本站的 server
可以这样开始调试 node-debug server
。
高级用法
上面是 inspector
最简单的用法,还有一种更为灵活的用法涉及到 inspector
的原理。
可以指定调试端口,可以手动启动程序(因为有了这一步我们可以做一些其他的事情,在下面的结合方法中介绍),
具体步骤和解释如下:
// 创建一个服务
node-inspector --web-port=8888 &
这是一个端口为8888的web服务,这个web服务一端是浏览器另一端通过websocket监听v8引擎。
虽然此时会有 Visit http://127.0.0.1:8888/debug?ws=127.0.0.1:8888&port=5858 to start debugging
这样的提示但是此时v8的调试端口并没有确定,下面的命令才会指定v8引擎的调试服务端口。
// 指定v8的调试端口,并启动v8装载程序
node --debug-brk=5858 server
// 当出现 Debugger listening on port 5858 时就证明已经监听成功
5858是v8的调试端口,可以自由指定。
// 在chrome浏览器中打开下面网址
http://127.0.0.1:8888/debug?ws=127.0.0.1:8888&port=5858
浏览器和引擎通过web socket同步,这样我们就可以进行调试。 另外一点需要说明的是在浏览器中启动调试port参数的值是上面指定v8调试端口,并不一定是提示的5858。 再多说几句,8888 是对浏览器的服务端口,8888服务监听端口了端口5858。 另外由于一些不确定的因素经常出现端口不能释放的情况, 如果按上面步骤不能达到预期的效果,换个端口试试。如果想查看端口的状态, 参考下面的命令:
// 打开新的命令行窗口
Mac:com + n Win7:Win + R / cmd
// 清空命令行窗口的内容
Mac:com + k Win7:cls
// 查看端口的存活情况
Mac:lsof -i:8899 Win7:netstat -ano|findstr "8899"
// 查看端口占用情况
Mac:lsof -i -P Win7:netstat -ano
Git:https://github.com/node-inspector/node-inspector
上面方案的不方便之处在于每次修改完源码并不会反映到调试窗口中,当然小的修改可以直接在天使窗口中进行,但是返回头还需要改源码。 如果要在调试器中看到新代码需要手动关闭再启动node服务。找到一个开源工具可以热启动node,他的原理是监听文件改变,如果有改变自动重启node服务,并打出log。
安装和运行非常简单,命令如下:
// 安装
npm install -g hotnode
// 热启动应用
hotnode app
Git:https://github.com/saschagehlich/hotnode
相似的热启动还有 node-dev
、 supervisor
和 nodemon
。
上面的准备已经做好,倒着一步就水到渠成了,
将inspector中的 node --debug-brk=5858 server
换成 hotnode --debug-brk=5858 server
就可以了。
上面是不依赖 IDE 的方式,但是用过 VS Code 之后发现用不着了解那么多东西,直接配置 VS Code 的启动项,然后 F5 就启动了,打断点、变量实时查看等各种调试方法都支持的很好。
require
加载相对路径的模块时其参考路径是当前的执行文件所在的路径,
fs
文件系统读取文件时参考路径是程序的启动路径,
如 node cellar/server
的路径是cellar文件夹所在的目录,而 node server
是server所在的路径,也就是cellar。
以 node cellar/server
为例,
通过全局变量下的属性 __filename
拿到当前文件所在文件夹路径,再通过设置相对于此文件向上几级目录是参考根路径拿到绝对路径作为参考。还有一个需要注意的地方就是将windows的左斜杠换成右斜杠。关键代码如下:
// 根路径,config.rootLevel
rootPath = __dirname.replace(/\\/g, '/').split('/').slice(0, -1 * config.rootLevel).join('/');
// 然后把根路径加到前面,用的时候就好了
config.webRootPath = rootPath + config.webRootPath;
另外还有一个技巧来统一启动路径,那就是在 package.json 中配置 scripts,执行脚本的时候用 npm run xxx
这种方式,这样脚本的启动路径就一定是项目根路径了。
下面是一个路由队列的方案,每个成功后调用下一个,在最后一个中做404处理。
// 路由队列(路由的优先顺序在此配置)
var routList = [
routStaticFile,
routUserSettingPath,
routAutoPath,
notFound
];
/* 异步编程的队列方案 */
routList.shift()(request, response, routList);
由于node中任何地方报错都会导致退出进程,所以生产环境需要在进程退出后重启,可用的工具:pm2
、forever
.
pm2扩展资料: http://www.douban.com/note/314200231/
http://www.jianshu.com/p/fdc12d82b661
forver扩展资料: http://blog.fens.me/nodejs-server-forever/
# 开启进程守护
pm2 start server --name my-server-name
# 显示所有进程状态
# 在 Linux 下是看不到其他用户启动的进程的,root 也不行
pm2 list
# 停止指定的进程
pm2 stop 0
# 从列表中移除,移除后进程也终止
pm2 delete api
# 重启进程
pm2 restart api