如何在2016年成为一个更好的Node.js开发者

本文主要讨论一些进行Node.js开发的最佳实践和建议,这些建议不仅仅适合开发者, 还适合那些管理与维护Node.js基础架构的工作人员。遵循本文提供的这些建议, 能够让你更好的进行日常的开发工作。

使用ES2015

在2015年的夏天,ES2015的最终草案(即ES6)正式发布了。该版本为JavaScript语言增加了大量的新的语言特性,主要包括:

箭头函数

模版字符串

rest operator(不定参数), argument spreading

生成器

promises

maps, sets

symbols

以及很多其他特性。一个更加完整的新特性的列表你可以从Kyle SimpsonES6 and Beyond中进行了解。 并且它们中的绝大部分特性已经被加入到了Node.js v4中。

在客户端,你也可以借助Babel来使用ES6的所有新特性,Babel是一个JavaScript转译器。目前在服务器端, 我们只倾向于使用那些被加入到最新的稳定版本的特性,这样无需转译代码,这可以避免出现那些令我们头疼的潜在问题。

对于Node.js中的ES6的更多信息,你可以访问官方站点:https://nodejs.org/en/docs/es6/

回调约定 - 同时支持Promise

在去年,我们可能会推荐你为你的模块暴露错误优先的回调接口。但是随着生成器函数的正式标准化,并且异步函数也即将到来, 因此我们现在建议你在编写模块的接口时应该暴露支持Promise的的错误优先的回调函数。

为什么需要这样?首先回调接口是为了提供向后兼容性,为了能够在未来能够获得更好的兼容性,需要同时提供Promise支持。

你可以参考下面的例子来进一步的理解具体应该如何进行编程。在这个例子中readPackage函数读取了package.json文件, 并同时通过Promise和回调接口返回了它的内容。

const fs = require('fs'); function readPackage (callback) { // as of now we do not have default values in Node.js callback = callback || function () {} return new Promise((resolve, reject) => { fs.readFile('./package.json', (err, data) => { if (err) { reject(err); return callback(err); } resolve(data); return callback(null, data); }) }) } module.exports.readPackage = readPackage;

异步模式

在Node.js中,很长一段时间你只有两种方法来管理异步流:回调或者流(Stream)。对于回调函数而言, 你可以使用类似于async这类库, 对于流而言,有throughblhighland等库可以选择。

但是随着Promise、生成器、异步函数等被逐渐引入进标准的ECMAScript,JS中的流程控制也得到了极大的改善。

关于异步JavaScript的发展历史,你可以参考这篇博文。

错误处理

错误处理在应用开发过程中起着至关重要的作用:确定应用崩溃的时间,或者仅仅是打印错误信息,确保应用继续运行都是有一定难度的。

为了能够更简单的说明这个问题,我们决定将其分为两种:程序员错误(programmer errors)和运算错误(operational errors)。

程序员错误就是我们所说的bug,由于你不知道程序运行的确切状态因此当出现错误时你最好立刻停止应用的运行(crash the process)。

另一方面,运算错误是由于系统或者远程服务本身所导致的问题。例如:请求超时和内存不足等。基于错误发生的特点,你可以对症下药, 然后重试,例如文件丢失,你可以去创建相应的文件。

在回调中进行错误处理

如果一个错误发生在异步操作的过程中,错误对象应该作为异步函数的第一个参数进行传递。你必须始终要检查该错误对象并进行错误处理。

在前面的有关回调约定的例子里面已经展示了如何在回调函数中进行错误的优先处理。

在Promise中进行错误处理

如果是下面的代码片段会发生什么情况?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/442224489c11fb28ae299b4a7043afc7.html