Node.js 十大常见的开发者错误( 三 )


错误7:认为 Number 是一种整型数据格式在 JavaScript 里数字都是浮点型,没有整型的数据格式 。你可能认为这不是什么问题,因为数字大到溢出浮点型限制的情况很少出现 。可实际上,当这种情况发生时就会出错 。因为浮点数在表达一个整型数时只能表示到一个最大上限值,在计算中超过这个最大值时就会出问题 。也许看起来有些奇怪,但在 Node.js 中下面代码的值是 true:
Math.pow(2, 53)+1 === Math.pow(2, 53)复制代码很不幸的是,JavaScript 里有关数字的怪癖可还不止这些 。尽管数字是浮点型的,但如下这种整数运算能正常工作:
5 % 2 === 1 // true5 >> 1 === 2 // true复制代码然而和算术运算不同的是,位运算和移位运算只在小于 32 位最大值的数字上正常工作 。例如,让“Math.pow(2, 53)” 位移 1 位总是得到 0,让其与 1 做位运算也总是得到 0:
Math.pow(2, 53) / 2 === Math.pow(2, 52) // trueMath.pow(2, 53) >> 1 === 0 // trueMath.pow(2, 53) | 1 === 0 // true复制代码你可能极少会去处理如此大的数字,但如果你需要的话,有很多实现了大型精密数字运算的大整数库可以帮到你,比如 node-bigint 。
错误8:忽略了流式 API 的优势现在我们想创建一个简单的类代理 web 服务器,它能通过拉取其他 web 服务器的内容来响应和发起请求 。作为例子,我们创建一个小型 web 服务器为 Gravatar 的图像服务 。
var http = require('http')var crypto = require('crypto') http.createServer().on('request', function(req, res) { var email = req.url.substr(req.url.lastIndexOf('/')+1) if(!email) {res.writeHead(404)return res.end() }var buf = new Buffer(1024*1024) http.get('http://www.gravatar.com/avatar/'+crypto.createHash('md5').update(email).digest('hex'), function(resp) {var size = 0resp.on('data', function(chunk) {chunk.copy(buf, size)size += chunk.length}).on('end', function() {res.write(buf.slice(0, size))res.end()}) })}).listen(8080)复制代码在这个例子里,我们从 Gravatar 拉取图片,将它存进一个 Buffer 里,然后响应请求 。如果 Gravatar 的图片都不是很大的话,这样做没问题 。但想象下如果我们代理的内容大小有上千兆的话,更好的处理方式是下面这样:
http.createServer().on('request', function(req, res) { var email = req.url.substr(req.url.lastIndexOf('/')+1) if(!email) {res.writeHead(404)return res.end() }http.get('http://www.gravatar.com/avatar/'+crypto.createHash('md5').update(email).digest('hex'), function(resp) {resp.pipe(res) })}).listen(8080)复制代码这里我们只是拉取图片然后简单地以管道方式响应给客户端,而不需要在响应它之前读取完整的数据存入缓存 。
错误9:出于 Debug 的目的使用 Console.log在 Node.js 里,“console.log” 允许你打印任何东西到控制台上 。比如传一个对象给它,它会以 JavaScript 对象的字符形式打印出来 。它能接收任意多个的参数并将它们以空格作为分隔符打印出来 。有很多的理由可以解释为什么开发者喜欢使用它来 debug 他的代码,然而我强烈建议你不要在实时代码里使用“console.log” 。你应该要避免在所有代码里使用“console.log” 去 debug,而且应该在不需要它们的时候把它们注释掉 。你可以使用一种专门做这种事的库代替,比如 debug 。
这些库提供了便利的方式让你在启动程序的时候开启或关闭具体的 debug 模式,例如,使用 debug 的话,你能够阻止任何 debug 方法输出信息到终端上,只要不设置 DEBUG 环境变量即可 。使用它十分简单:
// App.jsvar debug = require(‘debug’)(‘app’)debug(’Hello, %s!’, ‘world’)复制代码开启 debug 模式只需简单地运行下面的代码把环境变量 DEBUG 设置到“app” 或“*” 上:
DEBUG=app node app.js复制代码错误10:不使用监控程序不管你的 Node.js 代码是跑在生产环境或是你的本地开发环境,一个能协调你程序的监控程序是十分值得拥有的 。一条经常被开发者提及的,针对现代程序设计和开发的建议是你的代码应该有 fail-fast 机制 。如果发生了一个意料之外的错误,不要尝试去处理它,而应该让你的程序崩溃然后让监控程序在几秒之内重启它 。监控程序的好处不只是重启崩溃的程序,这些工具还能让你在程序文件发生改变的时候重启它,就像崩溃重启那样 。这让开发 Node.js 程序变成了一个更加轻松愉快的体验 。
Node.js 有太多的监控程序可以使用了,例如:
pm2
forever
nodemon
supervisor


推荐阅读