nodejs 编程建议(代码规范)

本文列举了Node.js编程中的一些重要建议,包括避免使用"try...catch"来处理异步错误,而是利用回调函数中的err参数;避免使用this和new以确保代码在不同上下文中也能正常运行;提倡编写更小的函数块和避免添加上下文变量;强调对err参数进行错误处理,以及避免使用with和eval;推荐使用严格相等运算符===,并始终在声明变量时使用var;回调函数应将err参数作为第一个参数,回调函数本身放在最后。遵循这些规范可以提高代码质量和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1. 不要使用 "try ... catch" ,因为nodejs都是异步操作,try catch无法捕捉回调里面的异常,除非你在回调里面也写try catch

try...catch statement cannot catch the error in callback. Here is an example:
fs = require('fs');


try {
  fs.stat('doesnt_exist.txt', function(err, stats) {
    if (err) {
      throw err;
    }
    console.log('data', stats);
  });
}
catch (e) {
  console.error('error statting');
}

这里的错误不会被捕捉。

解决方案


  1. 把数据库查询或者文本读取的try catch改为处理回调函数里面的第一个参数err,因为这些操作如果出错在nodejs里面是不会跑出异常而是返回一个err对象
  2. 使用forever https://github.com/nodejitsu/forever 这样进程挂掉就会被立马再次启动起来,记得设置 spinSleepTime !否则你的程序在1s内挂两次就再也启动不起来了
  3. 官方建议使用domain对象,如果是使用express的朋友可以直接使用 express-domain-middleware,这个插件有几个好处
    a 捕获系统中所有的异常,并且可以自己定义出错的解决逻辑
    b 在所有的流程中都会增加一个requestid,可以通过这个id在日志中体现出一个请求所经过的流程,解决了异步操作通过日志无法识别某个请求的问题
其实还有一种解决方案是不推荐的(官方也极力反对)
process.on('uncaughtException', function(err) {
  console.error(err.stack);
});

这个方法在捕捉未考虑到的异常方面,万无一失,但是对于程序来说不是一个好习惯,我也不推荐


2. 避免使用 this 和 new

因为 Node.js 传递很多回调和有很多高阶函数,所以你要博阿正你的程序能在别的地方被调用的时候不会出问题,尽量不要用跟上下文相关的 this 和 new



3. 更小的函数块

尽量不要陷入“回调地狱”,让函数更小
// 一个回调嵌套回调的例子


function convertJsonToCsv(filename, target, callback) {
    readFile(filename, function (err, content) {
        if (err) {
            return callback(err);
        }
        parseJson(content, function (err, data) {
            if (err) {
                return callback(err);
            }
            convertToCsv(data, function (err, csv) {
                if (err) {
                    return callback(err);
                }
                writeFile(target, csv, callback);
            });
        });
    });
}




// 切分成小块之后


function convertJsonToCsv(filename, target, callback) {
readJsonFile(filename, function (err, data) {
if (err) { return callback(err); }
writeCsvFile(target, data, callback);
});
}
function readJsonFile(filename, callback) {
readFile(filename, function (err, content) {
if (err)
{ return callback(err); }
parseJson(content, callback);
});
}


function writeCsvFile(target, data, callback) {
convertToCsv(data, function (err, csv) {
if (err) { return callback(err); }
writeFile(target, csv, callback);
});
}



4. 避免加入上下文的变量

如果混入了函数以外的变量,那么在这个函数在别的地方被调用的时候就会出现不可预见的结果
var CACHE = {};
function getRecord(id, callback) {
if (CACHE[id])
{ return CACHE[id]; }
http.get('http://foo/' + id, callback);
}

//别人在用这段代码的时候容易忘记CACHE变量
function getMyRecord(user, callback)
{ getRecord('record-' + user.id, callback); }


5. 总是对err参数编写相应的错误处理函数

忘记处理err变量可以视为是一种bug
//Wrong code:
function writeCsvFile(target, data, callback) {
  convertToCsv(data, function (err, csv)
  { writeFile(target, csv, callback); }
  );
}

//Right code:
function writeCsvFile(target, data, callback) {
  convertToCsv(data, function (err, csv) {
    if (err)
    { return callback(err); }
  writeFile(target, csv, callback);
  });
}


注意 : 记得返回callback函数,以下的写法会造成虽然callback被调用了,但是代码还是继续执行下去了
if (err)
{ callback(err); }


6. 永远不要使用 with 或者 eval

7. 用 === 代替 ==

8. 声明变量的时候总是带 var

不要污染 global 范围的变量

9. 回调函数总是把err参数作为第一个变量,如果参数中有回调函数,总是放在最后

比如  callback(err, param1, param2, callback)

PS:更详细的 Node.js 代码规范见:

https://github.com/felixge/node-style-guide
http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml
Reference:
http://geoff.greer.fm/2012/06/10/nodejs-dealing-with-errors/
http://stackoverflow.com/questions/5495984/coding-style-guide-for-node-js-apps

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值