本文是“NodeJS 最佳实践”教程,分上下两个部分。
上篇
人们总是问我们关于Node.js的最佳实战和技巧,所以打算通过这篇文章解释清楚,并总结一下我们在RisingStack公司写代码的经验。
Node.js最佳实战中的一部分是编码规范,另一部分则是处理开发流程。
编码规范
回调惯例
模块应该公开一个错误优先(error-first)的回调接口。
就像下面这样:
1 2 3 4 5 6 7 8 |
module.exports = function (dragonName, callback) { // 这里做一些处理工作 var dragon = createDragon(dragonName); // 注意, callback第一个参数是 error // 这里传入null // 如果出错则传入错误信息 return callback(null, dragon); } |
确保在回调中检查错误信息
要更好地弄明白为什么必须这样做,先想办法创建一个会挂掉的例子,然后修复它。
1 2 3 4 5 6 7 8 |
// 这个例子是会挂掉的, 我们很快会修复 :) var fs = require('fs'); function readJSON(filePath, callback){ fs.readFile(filePath, function(err, data) { callback(JSON.parse(data)); }); } readJSON('./package.json', function (err, pkg) { ... } |
首要问题是 readJSON
函数,在执行过程中出现了错误,而这个函数却没有做任何错误检查。你务必要先做错误检查。
改进方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 这个例子还是会挂掉 , 很快会修复! function readJSON(filePath, callback) { fs.readFile(filePath, function(err, data) { // 这里我们先判断是否有错误发生 if (err) { // 出现错误,将错误传入回调函数 // 记住: 错误优先(error-first) 回调 callback(err); } // 如果没有错误则传入null和JSON callback(null, JSON.parse(data)); }); } |
将回调函数返回
上面的例子还是存在一个错误,就是如果错误发生了,if
中的表达式不会停止运行,而是继续运行下去。这会导致很多未知的错误。长话短说,务必通过回调函数返回。
1 2 3 4 5 6 7 8 9 10 |
// 这个例子仍旧会挂掉, 马上修复! function readJSON(filePath, callback) { fs.readFile(filePath, function(err, data) { if (err) { return callback(err); } return callback(null, JSON.parse(data)); }); } |
仅在同步代码中使用try-catch
几乎完美了!但还有一件事,我们必须要小心 JSON.parse
。调用JSON.parse
时,如果传入的字符串无法解析成JSON
格式,会抛出异常。
由于JSON.parse是同步发生的,我们可以用try-catch包装起来。请注意,你只能对同步代码块做此操作,对回调函数是不起作用的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 这个例子终于可以正常工作啦 :) function readJSON(filePath, callback) { fs.readFile(filePath, function(err, data) { var parsedJson; span class="crayon-sy">) { var parsedJson; ՙ程,分上下两个部分。
上篇人们总是问我们关于Node.js的最佳实战和技巧,所以打算通过这篇文章解释清楚,并总结一下我们在RisingStack公司写代码的经验。 Node.js最佳实战中的一部分是编码规范,另一部分则是处理开发流程。 编码规范回调惯例模块应该公开一个错误优先(error-first)的回调接口。 就像下面这样:
确保在回调中检查错误信息要更好地弄明白为什么必须这样做,先想办法创建一个会挂掉的例子,然后修复它。
首要问题是 改进方案:
将回调函数返回上面的例子还是存在一个错误,就是如果错误发生了,
仅在同步代码中使用try-catch几乎完美了!但还有一件事,我们必须要小心 由于JSON.parse是同步发生的,我们可以用try-catch包装起来。请注意,你只能对同步代码块做此操作,对回调函数是不起作用的。
|