[译]Node.js Best Practices
原文: 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, 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.
[译]Node.js Best Practices的更多相关文章
- [译]Node.js Best Practices - Part 2
原文: https://blog.risingstack.com/node-js-best-practices-part-2/ 统一风格 在大团队开发JS应用, 创建一个风格指南是很有必要的. 推荐看 ...
- [译]Node.js - Event Loop
介绍 在读这篇博客之前,我强列建议先阅读我的前两篇文章: Getting Started With Node.js Node.js - Modules 在这篇文章中,我们将学习 Node.js 中的事 ...
- [译]Node.js Interview Questions and Answers (2017 Edition)
原文 Node.js Interview Questions for 2017 什么是error-first callback? 如何避免无止境的callback? 什么是Promises? 用什么工 ...
- 译\Node.js应用的持续部署
Node.js应用的持续部署 翻译前 翻译自:https://blog.risingstack.com/continuous-deployment-of-node-js-applications/ 正 ...
- [译]Node.js : Building RESTful APIs using Loopback and MySQL
国庆后可能就要使用StrongLoop那套东西来做项目了 原文:http://www.javabeat.net/loopback-mysql/ Loopback是什么? Loopback是一个开源的N ...
- [译]Node.js面试问与答
原文: http://blog.risingstack.com/node-js-interview-questions/ 什么是error-first callback? 如何避免无休止的callba ...
- (译)Node.js的 EventEmitter 教程
原文标题:Node.js EventEmitter Tutorial 原文链接:http://www.hacksparrow.com/node-js-eventemitter-tutorial.htm ...
- (译)Node.js的全局变量
原文标题:Global Variables in Node.js 原文链接:http://www.hacksparrow.com/global-variables-in-node-js.html 你可 ...
- (译)Node.js的模块-exports和module.exports
原文标题:Node.js Module – exports vs module.exports 原文链接:http://www.hacksparrow.com/node-js-exports-vs-m ...
随机推荐
- 你应该了解Nginx的7个原因
Nginx ("engine x")是一个高性能的HTTP和反向代理服务器,也是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器 1 负载均衡实 ...
- 文件内容统计——Linux wc命令
有了该命令,就可以得到当前目录下所有符合条件的文件总数,如下: find -type f | wc -l 这个命令的功能也很好记,因为它功能很有限: wc -c filename:显示一个文件的字节数 ...
- 数据结构算法C语言实现(十七)--- 5.1&5.2数组:定义、顺序表示及实现
一.简述 理解数组位置的计算公式 LOC(j1, j2, ···, jn) = LOC(0, 0, ..., 0) + (b2 x ··· x bn x j1 + b3 x ··· x bn x j2 ...
- Web 四种常见的POST提交数据方式
HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...
- python数据类型和字符串(三)
一.变量 变量声明变量 #!/usr/bin/env python age= gender1='male' gender2='female' 变量作用:保存状态(程序的运行本质是一系列状态的变化,变量 ...
- JS-DOM 综合练习-动态添加删除班级成绩表
费了2个小时,才把原理弄懂,把问题逐个解决,当你发现你最后栽的那个点,是一个小石头拌的你,你起来是该哭还是该笑呢?只怪自己习武不精吧. 虽然问题都解决了,但是还有一个余留的问题就是鼠标经过input时 ...
- HTTPS 客户端验证 服务端证书流程
网上的文章很多, 但是对摘要的验证流程不够通俗易懂. QQ截图20160420114804.png 证书预置和申请 1:客户端浏览器会预置根证书, 里面包含CA公钥2:服务器去CA申请一个证书3: C ...
- git-tag
标签可以针对某一时间点的版本做标记,常用于版本发布. 列出标签 $ git tag # 在控制台打印出当前仓库的所有标签 $ git tag -l 'v0.1.*' # 搜索符合模式的标签 打标签 g ...
- php装饰器模式完成文章编辑
<?php //文章父类 class BaseArt{ protected $content; protected $art; public function __construct($cont ...
- vim 显示颜色脚本
vim 显示颜色脚本 echo TERM=xterm >>/root/.bash_profile echo export TERM >>/root/.bash_profile ...