nodejs 编程建议(代码规范)

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

nodejs 编程建议(代码规范)

时间: 2024-08-25 15:03:02

nodejs 编程建议(代码规范)的相关文章

Object-C 声明属性为什么用下划线,代码规范和编程风格

原文:http://blog.sina.com.cn/s/blog_7b9d64af0101923n.html 在阅读和书写关于iPhone编程的代码的时候,发现有很多这样的情况: 看到很多源代码里面,使用前面带下划线变量,然后在@synthesize 语句中 在用一个不带下划线的变量名. 这样做,到底有什么作用? 因为我常常是以这种方式来做的: *.h中申明变量 #import <UIKit/UIKit.h> @interface NewPlayerController : UIViewCo

标C编程笔记day08~day10代码规范、编译、库函数、命名空间、函数调用、哑元函数

代码编写规范,命令行编译,库函数简介,命名空间介绍,函数调用介绍,哑元函数介绍 一般来说,有.c实现文件,应该都要有.h头文件,.c文件中的所有函数都应该在.h文件中声明. 命令行编译方法: 1.gcc 后面带所有.c 文件 -o 输出文件名   直接生成可执行文件 2.依次gcc -c .c文件  -o ***.o  生成***.o文件 然后 gcc 所有.o文件 -o 输出文件   生成可执行文件 程序中的静态全局变量不可以被其他文件中的语句使用. .c文件使用.h文件中的全局变量:exte

Node.js学习笔记【3】NodeJS基础、代码的组织和部署、文件操作、网络操作、进程管理、异步编程

一.表 学生表 CREATE TABLE `t_student` ( `stuNum` int(11) NOT NULL auto_increment, `stuName` varchar(20) default NULL, `birthday` date default NULL, PRIMARY KEY  (`stuNum`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 学生分数表 CREATE TABLE `t_stu_score` ( `id` int(11

作业三:代码规范

对于是否需要有代码规范,请考虑下列论点并反驳/支持: 1. 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 对于以上观点我是反对的 .如果说这些规范都是官僚制度产生的,那么更应该一丝不苟的执行,官僚制度,往大了说是法,应该无条件执行,往小了说是规范,可以帮助我们规范在打代码时自身不好的习惯.也许在编辑代码时,会比随意敲打耽误些许时间,但在检查错误时,规矩的编排格式,可以一目了然的看到自己的错误,为自己节省了更多的时间,会提高开发效率. 2. 我是个艺术家,手

软件工程第二周作业:代码规范和代码复审

0x01 :代码规划的要求 Q:这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西.(反驳) 首先,我们需要明确编码规范的定义,编码规范同时包括了编码风格和其它规范(代码设计上的规范,如设计模式.程序设计.模块之间的逻辑关联等). 编码风格,牵扯到“缩进.空格使用.注释.命名习惯”等多方面的因素,是依致特定编程语言制定的软件工程开发的“约定”,而相同的编码风格,可以使得软件开发过程中轻松浏览任意一段代码,充分保证不同的开发人员能够依据统一的编码格式轻松理解代码的逻

代码规范及代码复审

1.对代码规范的讨论 编写一个程序是否需要代码规范?本人以为,规范当然得有,但也必须合理. 为什么我们需要代码规范?代码规范就是规定代码中某些格式必须遵守一定条件,比如缩进.变量命名.注释等.当制定了合理的规范后,不仅代码本身会显得美观,而且每个人都很容易读懂,代码的可维护性也大大增强.举个例子,甲程序里使用的变量名有input_msg,output_msg,decipher,每个符号之间均加了空格,而乙程序里则是随意地使用a,b,c等无意义的字母作为变量名,而且多个函数里重复使用相同名称的局部

关于“代码规范”,“Review”和“Check list”(续)

在前两天的    关于“代码规范”,“Review”和“Check list”    一文中,我给自己列出了Check list,如下: 1.代码能够工作么?它有没有实现预期的功能,逻辑是否正确等. 2.所有的代码是否简单易懂? 3.代码符合你所遵循的编程规范么?这通常包括大括号的位置,变量名和函数名,行的长度,缩进,格式和注释. 4.是否存在多余的或是重复的代码? 5.代码是否尽可能的模块化了? 6.是否有可以被替换的全局变量? 7.是否有被注释掉的代码? 8.循环是否设置了长度和正确的终止条

iOS代码规范

前言 开发iOS至今已经有一年多的时间了,一直没有对代码做一个比较好的规范,最近公司人手逐渐增多,每个人写的代码都是无花八门,看着十分不习惯.于是综合网上一些人的经验和自己的一些编程习惯,总结出了如下的iOS代码规范. 命名规范 类命名 首字母大写,之后每个单词首字母都大写 使用能够反映类功能的名词短语 文件和类同名 特殊类命名 如果是视图控制器的子类应添加后缀"ViewController"或者"Controller",BeeFramwork中加"Boa

(转)ios 代码规范

转自http://blog.csdn.net/pjk1129/article/details/45146955 引子 在看下面之前,大家自我检测一下自己写的代码是否规范,代码风格是否过于迥异阅读困难?可以相互阅读同伴的代码,是否存在阅读障碍? 若存在晦涩难懂的,理解成本增大的代码,说明你的团队需要自省了. 下面总结一下OC编程中的一些代码规范(苹果官方推荐的).以OC为示例,但不局限于OC,也可以被当作别的编程语言的开发规范约定(仅需要把OC特有的东西按照你所使用的语言的惯例即可) 参考资料:苹