原文: http://blog.risingstack.com/node-js-best-practices/

下面的的最佳实践分为代码风格和开发工作流两种.

代码风格

Callback约定

Modules应该暴露出一个以error为第一个参数的callback接口.

如下:

module.exports = function (dragonName, callback) {
// 写下你module的逻辑
var dragon = createDragon(dragonName); // 注意, 第一个参数是error
// 在这里error为null
// 但是当一个错误发生的时候应该是一个Error
return callback(null, dragon);
}

  

总是在callback函数里面去检查error

为了更好的理解为什么要在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));
});
}

返回callback

上面的例子还有一个错误, 如果一个错误发生了, 代码不会在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));
});
}

在同步代码里面使用try-catch

值得注意的是如果传入的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);
});
}

  

避免使用avoid和new

在Node里面绑定一个特殊的上下文不是一个好的选择, 因为Node有太多太多的callback, and heavy use of higher-level functions to manage control flow. 使用函数风格可以解决你很多问题. 
当然在某些情况下使用prototypes非常有效率, 但是如果可以的话尽量避免使用他们.

创建小的modules

使用好的异步模式

使用 async.

处理Error

Errors分为两种: operational errors 和 programmer errors.

Operational errors

及时完美无bug的应用也可能发生错误, 如下:

  • 请求超时
  • 系统内存耗尽
  • 链接远程服务失败failed to connect to a remote service
处理operational errors

你可以通过下面的方式来处理:

  • 试着去解决错误 - 如果一个文件没了, 你可以先创建一个
  • 诸如请求外网失败的时候可以自动重新在去操作一次
  • 告诉客户有错误发生了 - 可以使用来处理客户的输入
  • Crash the process, when the error condition is unlikely to change on its own, like the application cannot read its configuration file

当然最重要的是使用log.

Programmer errors

Programmer errors一般来说都是一些bug, 如下:

  • 调用异步函数但是没有使用callback
  • 不能读取undefined的属性
处理programmer errors

立刻崩溃 - 因为这些错误是一些bug. 当应用崩溃的话, 应该自动去重新启动应用. 可以使用: supervisord 和 monit.

Workflow tips

开始一个新项目的第一步一定是npm init

init命令帮助我们创建应用程序的package.json文件.

以下面的命令开始你的新项目:

mkdir my-awesome-new-project
cd my-awesome-new-project
npm init

指定一个start和test script

package.json中的scripts节点中里面设置script. 默认情况下面npm生成两个script, starttest. 在这我们可以使用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.

[译]Node.js Best Practices的更多相关文章

  1. [译]Node.js Best Practices - Part 2

    原文: https://blog.risingstack.com/node-js-best-practices-part-2/ 统一风格 在大团队开发JS应用, 创建一个风格指南是很有必要的. 推荐看 ...

  2. [译]Node.js - Event Loop

    介绍 在读这篇博客之前,我强列建议先阅读我的前两篇文章: Getting Started With Node.js Node.js - Modules 在这篇文章中,我们将学习 Node.js 中的事 ...

  3. [译]Node.js Interview Questions and Answers (2017 Edition)

    原文 Node.js Interview Questions for 2017 什么是error-first callback? 如何避免无止境的callback? 什么是Promises? 用什么工 ...

  4. 译\Node.js应用的持续部署

    Node.js应用的持续部署 翻译前 翻译自:https://blog.risingstack.com/continuous-deployment-of-node-js-applications/ 正 ...

  5. [译]Node.js : Building RESTful APIs using Loopback and MySQL

    国庆后可能就要使用StrongLoop那套东西来做项目了 原文:http://www.javabeat.net/loopback-mysql/ Loopback是什么? Loopback是一个开源的N ...

  6. [译]Node.js面试问与答

    原文: http://blog.risingstack.com/node-js-interview-questions/ 什么是error-first callback? 如何避免无休止的callba ...

  7. (译)Node.js的 EventEmitter 教程

    原文标题:Node.js EventEmitter Tutorial 原文链接:http://www.hacksparrow.com/node-js-eventemitter-tutorial.htm ...

  8. (译)Node.js的全局变量

    原文标题:Global Variables in Node.js 原文链接:http://www.hacksparrow.com/global-variables-in-node-js.html 你可 ...

  9. (译)Node.js的模块-exports和module.exports

    原文标题:Node.js Module – exports vs module.exports 原文链接:http://www.hacksparrow.com/node-js-exports-vs-m ...

随机推荐

  1. [NOIP2012] 提高组 洛谷P1082 同余方程

    题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...

  2. JS+JavaBean判断管理员增删改的操作权限

    目标:用户分管理员和普通用户2种,都可以登陆,但是管理员才可以执行增删改的权限,普通用户可以看,但是执行的时候提示权限不足 帖代码片段:我只会这一种,在JSP页面判断 省略得权限数值方法: <% ...

  3. Beta版本——第二次冲刺博客

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...

  4. sql 编写横竖表转换

    将横表转为竖表,基本思想是: 1)将横表的多条数据,"压"成一条.相当于将这么多条分组,每组"压"成一条数据.利用group by 2) 再对竖表中的列,由特定 ...

  5. 数组Arrays

    1.toString 方法 Arrays的toString方法可以方便的输出一个数组的字符串形式,方便查看,它有九个重载的方法,包括八种基本类型数组和一个对象类型数组,这里列举两个: public s ...

  6. 自然语言19_Lemmatisation

    QQ:231469242 欢迎喜欢nltk朋友交流 https://en.wikipedia.org/wiki/Lemmatisation Lemmatisation (or lemmatizatio ...

  7. Oralce配置正确,报监听错误或无法识别描述中的服务

    出差客户现场,修改过网络配置,回来后本地虚拟机的Oracle数据库就不能登陆了 报监听错误,在服务器中使用Net Configration Assistant删除以前的,重新配置新的,还是不行,重启系 ...

  8. jquery id选择器 id带"."问题

    例如控件ID为user.id 使用$("#user.id")不能得到正确的结果 必须使用\\转义 即$("#user\\.id")

  9. 20145212 《Java程序设计》第5周学习总结

    20145212 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 1.Java中所有错误都会被打包为对象,通过try和catch语法可以对代表错误的对象做处理. try{ . ...

  10. SublimeText2使用笔记

    将Sublime Text2 加入右键菜单(转) 1. 运行中输入 regedit 打开注册表 2. 在HKEY_CLASSES_ROOT/*/shell/ 下新建’项’ ,名称自己觉得.我用的是Su ...