标签:
原文: http://blog.risingstack.com/node-js-best-practices/
下面的的最佳实践分为代码风格和开发工作流两种.
Modules应该暴露出一个以error为第一个参数的callback接口.
如下:
module.exports = function (dragonName, callback) {
// 写下你module的逻辑
var dragon = createDragon(dragonName);
// 注意, 第一个参数是error
// 在这里error为null
// 但是当一个错误发生的时候应该是一个Error
return callback(null, dragon);
}
为了更好的理解为什么要在callback函数里面检查error, 我们故意让程序出错, 下一步在修复他.
// this example is **BROKEN**, we will fix it soon :)
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的第一个问题是他从来没有去检查是否出错.下面让我们来改善一下
// this example is **STILL BROKEN**, we are fixing it!
function readJSON(filePath, callback) {
fs.readFile(filePath, function(err, data) {
// 在这我们检查是不是有一个错误发生了
if (err) {
// 传递error给callback
// 记住: callback的第一个参数是err
callback(err);
}
// 没错的话, 传递一个null和JSON
callback(null, JSON.parse(data));
});
}
上面的例子还有一个错误, 如果一个错误发生了, 代码不会在if里面停止还会继续执行下面的代码. 我们一定要记得return callback.
// this example is **STILL BROKEN**, we are fixing it!
function readJSON(filePath, callback) {
fs.readFile(filePath, function(err, data) {
if (err) {
return callback(err);
}
return callback(null, JSON.parse(data));
});
}
值得注意的是如果传入的data是一个非法的JSON格式, JSON.parse可能会抛出一个exception.
因为JSON.parse是同步执行的, 我们可以用一个try-catch把他包起来. 注意, 只能在同步的代码块用try-catch!
// this example **WORKS**! :)
function readJSON(filePath, callback) {
fs.readFile(filePath, function(err, data) {
var parsedJson;
// Handle error
if (err) {
return callback(err);
}
// Parse JSON
try {
parsedJson = JSON.parse(data);
} catch (exception) {
return callback(exception);
}
// Everything is ok
return callback(null, parsedJson);
});
}
在Node里面绑定一个特殊的上下文不是一个好的选择, 因为Node有太多太多的callback, and heavy use of higher-level functions to manage control flow. 使用函数风格可以解决你很多问题.
当然在某些情况下使用prototypes非常有效率, 但是如果可以的话尽量避免使用他们.
使用 async.
Errors分为两种: operational errors 和 programmer errors.
及时完美无bug的应用也可能发生错误, 如下:
你可以通过下面的方式来处理:
当然最重要的是使用log.
Programmer errors一般来说都是一些bug, 如下:
不能读取undefined的属性立刻崩溃 - 因为这些错误是一些bug. 当应用崩溃的话, 应该自动去重新启动应用. 可以使用: supervisord 和 monit.
init命令帮助我们创建应用程序的package.json文件.
以下面的命令开始你的新项目:
mkdir my-awesome-new-project cd my-awesome-new-project npm init
在package.json中的scripts节点中里面设置script. 默认情况下面npm生成两个script, start和test. 在这我们可以使用npm start和npm test.
我们可以自定义一些script, 可以使用npm run-script <SCRIPT_NAME> 调用触发.
Note, that NPM will set up $PATH to look in node_modules/.bin for executables. This helps avoid global installs of NPM modules.
Production/staging 部署应该通过环境变量来完成.
可以使用nconf根据你的环境变量, 加载不同的配置.
总是先查找是不是已经有现成的解决方案. NPM有非常多的packages, 这里极有可能有符合你要求的package.
如果代码都是使用一种风格编写的, 这将对我们阅读代码变的容易些. 比如缩进规则, 参数命名规则.
可以看看这 RisingStack‘s Node.js style guide.
标签:
原文地址:http://www.cnblogs.com/irocker/p/4402970.html