[译]Node.js Best Practices
原文: http://blog.risingstack.com/node-js-best-practices/
下面的的最佳实践分为代码风格和开发工作流两种.
代码风格
Callback约定
Modules应该暴露出一个以error为第一个参数的callback接口.
如下:
1 2 3 4 5 6 7 8 9 | module.exports = function (dragonName, callback) { // 写下你module的逻辑 var dragon = createDragon(dragonName); // 注意, 第一个参数是error // 在这里error为null // 但是当一个错误发生的时候应该是一个Error return callback( null , dragon); } |
总是在callback函数里面去检查error
为了更好的理解为什么要在callback函数里面检查error, 我们故意让程序出错, 下一步在修复他.
1 2 3 4 5 6 7 8 9 10 | // 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的第一个问题是他从来没有去检查是否出错.下面让我们来改善一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // 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.
1 2 3 4 5 6 7 8 9 10 | // 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!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // 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
文件.
以下面的命令开始你的新项目:
1 2 3 | 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.
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 2025成都.NET开发者Connect圆满结束
· Ollama本地部署大模型总结
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 在 VS Code 中,一键安装 MCP Server!
· 用一种新的分类方法梳理设计模式的脉络