本文共 4184 字,大约阅读时间需要 13 分钟。
许多人都有这样一种映像,NodeJS比较快; 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务; 它比较适合对并发要求比较高,而且简单的业务场景。
在Express的作者的TJ Holowaychuk的 告别Node.js一文中列举了以下罪状: Farewell NodeJS (TJ Holowaychuk) • you may get duplicate callbacks • you may not get a callback at all (lost in limbo) • you may get out-of-band errors • emitters may get multiple “error” events • missing “error” events sends everything to hell • often unsure what requires “error” handlers • “error” handlers are very verbose • callbacks suck 其实这几条主要吐嘈了两点: node.js错误处理很扯蛋,node.js的回调也很扯蛋。var http = require('http');var server = http.createServer(function (req, res) { //这里有个错误,params 是 undefined var ok = req.params.ok; res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n');});server.listen(8080, '127.0.0.1');console.log('Server running at http://127.0.0.1:8080/');
启动服务,并在地址栏测试一下发现 不出所料,node崩溃了
$ node node-errorServer running at http://127.0.0.1:8080/c:\github\script\node-error.js:5 var ok = req.params.ok; ^TypeError: Cannot read property 'ok' of undefined at Server.(c:\github\script\node-error.js:5:22) at Server.EventEmitter.emit (events.js:98:17) at HTTPParser.parser.onIncoming (http.js:2108:12) at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23) at Socket.socket.ondata (http.js:1966:22) at TCP.onread (net.js:525:27)
1 2 3 4 5 6 | process.on( 'uncaughtException' , function (err) { //打印出错误 console.log(err); //打印出错误的调用栈方便调试 console.log(err.stack); }); |
这相当于在node进程内部进行守护, 但这种方法很多人都是不提倡的,说明你还不能完全掌控Node.JS的异常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | var http = require( 'http' ); http.createServer( function (req, res) { try { handler(req, res); } catch (e) { console.log( '\r\n' , e, '\r\n' , e.stack); try { res.end(e.stack); } catch (e) { } } }).listen(8080, '127.0.0.1' ); console.log( 'Server running at http://127.0.0.1:8080/' ); var handler = function (req, res) { //Error Popuped var name = req.params.name; res.writeHead(200, { 'Content-Type' : 'text/plain' }); res.end( 'Hello ' + name); }; |
这种方案的好处是,可以将错误和调用栈直接输出到当前发生的网页上。
try { handler(req, res); } catch(err) { var errorMsg = '\n' + 'Error ' + new Date().toISOString() + ' ' + req.url + '\n' + err.stack || err.message || 'unknow error' + '\n' ; console.error(errorMsg); Settings.showError ? res.end('' + errorMsg + '') : res.end(); }
那么不在回调中产生的错误怎么办?不必担心,其实这样的node程序根本就起不起来。 此外node自带的 也有一定的容错能力,它跟nginx的worker很类似,但消耗资源(内存)略大,编程也不是很方便,OurJS并没有采用此种设计。
[sudo] npm install forever使用也很简单
$ forever start simple-server.js$ forever list [0] simple-server.js [ 24597, 24596 ]还可以看日志
forever -o out.log -e err.log my-script.js
WEB_DIR='/var/www/ourjs'WEB_APP='svr/ourjs.js'#location of node you want to useNODE_EXE=/root/local/bin/nodewhile true; do { $NODE_EXE $WEB_DIR/$WEB_APP config.magazine.js echo "Stopped unexpected, restarting \r\n\r\n" } 2>> $WEB_DIR/error.log sleep 1done
错误日志记录也非常简单,直接将此进程控制台当中的错误输出到error.log文件即可: 2>> $WEB_DIR/error.log 这一行, 2 代表 Error。
本文转自王磊的博客博客园博客,原文链接:http://www.cnblogs.com/vipstone/p/4866262.html,如需转载请自行联系原作者