阅读更多

1顶
0踩

编程语言

转载新闻 Node.js 最佳编程实践

2015-07-29 14:40 by 副主编 mengyidan1988 评论(2) 有5958人浏览
本文谈一谈Node.js的最佳实践,包括Node.js的代码风格以及开发者工作流。

代码风格

回调约定
模块应该暴露错误优先的回调接口。
module.exports = function (dragonName, callback) {  
  // do some stuff here
  var dragon = createDragon(dragonName);

  // note, that the first parameter is the error
  // which is null here
  // but if an error occurs, then a new Error
  // should be passed here
  return callback(null, dragon);
}

总是在回调中检查错误: 为了理解这一点,我们从一个违反该规则的例子看起
// 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函数的最主要的问题是,如果在执行过程中发生Error,它并不会检查这个错误。
改进版本如下:
// this example is **STILL BROKEN**, we are fixing it!
function readJSON(filePath, callback) {  
  fs.readFile(filePath, function(err, data) {
    // here we check, if an error happened
    if (err) {
      // yep, pass the error to the callback
      // remember: error-first callbacks
      callback(err);
    }

    // no error, pass a null and the JSON
    callback(null, JSON.parse(data));
  });
} **在回调中返回!**

上面代码仍然存在的问题是,当Error发生的时候,程序的执行并不会在if语句中停止,而是会继续。这回导致很多意料之外的问题。正如上面加粗部分提到的,总是在回调中返回!
// 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**

有一点需要注意的是,JSON.parse在无法将指定的字符串格式化为JSON格式的时候会抛出一个异常。

因为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);
  });
}

避免this和new

在Node中与指定的上下文绑定并不是总是个好事,因为在Node程序中经常涉及到传递回调函数,并且会经常使用高层函数管理工作流。函数风格的编程方式会帮你避免很多麻烦。

创建小模块

使用Unix的方式:
引用

Developers should build a program out of simple parts connected by well defined interfaces, so problems are local, and parts of the program can be replaced in future versions to support new features.

保持模块足够小(内聚),模块应该只做一件事!

使用好的同步模式

使用async

错误处理

错误主要分为两种:操作错误(operational errors)和程序员错误。
Operational errors

例如:
  • 请求超时
  • 系统内存不足
  • 连接远程服务失败

处理Operational errors

Log everything! 启用日志服务!
程序员错误

程序员错误即是程序的bug。这是你可以尽量避免的,比如:
  • 调用异步方法时没有使用回调
  • 无法读取undefined的属性

工作流建议
使用npm init启动一个新项目

init命令帮你创建一个应用的package.json文件,并且会设置一些初始值,便于你后期进行修改。试着用这个命令启动一个新项目吧:
mkdir my-awesome-new-project  
cd my-awesome-new-project  
npm init


指定一个start和test脚本

在package.json中你可以使用script属性设置脚本。默认情况下,npm init会生成两个,start和test。你可以使用npm start和npm test执行他们。

当然你也可以定义自己的脚本,使用如下命令执行npm run-script <SCRIPT_NAME>。

注意,NPM会设置$PATH来查找node_modules/.bin中的可执行文件。这可以避免安装全局的NPM模块。也就是说,例如grunt这样的工具,你可以只安装在项目中,而不是全局安装这个NPM模块。

环境变量

在生产和开发环境可能需要设置不同的环境变量,最通常的方法是通过NODE_ENV来分别设置production或staging。

基于不同的环境变量,你可以载入不同的配置信息,例如可以借助nconf模块

当然你也可以利用process.env在你的Node.js应用程序中使用其他的环境变量,也就是你可以在一个对象中包含用户环境。

可以参考Node的对应文档
不要重复发明轮子

首先寻找已有的解决方案。NPM中包括非常丰富的包,所以请最大化的利用这些资源。

使用风格指南

可以参考RisingStack的Node.js风格指南

References
本文翻译自:https://blog.risingstack.com/node-js-best-practices/
译文来自:http://wwsun.me/
1
0
评论 共 2 条 请登录后发表评论
2 楼 windlike 2015-08-05 10:13
题目写的有点大
1 楼 mangguo 2015-07-30 11:12
代码风格这方面的东西很是受益匪浅,thanks最近也是在学nodejs

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • C++调用其它exe执行文件.

    在C++程序中,调用其它exe执行文件.在C++程序中,调用其它exe执行文件.

  • C/C++::浅谈.obj .exe .dll .lib关系&& .o .a .so关系

    浅谈.lib .dll .obj 关系&amp;amp;&amp;amp; .a .so .o关系  一、.obj .exe .dll .lib (1).obj 目标文件,相当于源代码对应的二进制文件。 obj文件就是用.c .cpp .h文件经过编译器编译之后生成的目标文件。 (2).exe 将程序运行所需要的全部.obj文件连接起来,即形成.exe文件。 也就是windows下的可执行文件。 o...

  • Windows 动态库编程技术 C++ 库文件三种模式: lib、dll、dll+lib详解及其创建使用

    动态链接库为模块化应用程序提供了一种方式,使得更新和重用程序更加方便,当几个应用程序在同一时间使用相同的函数时,它也帮助减少内存消耗,这是因为虽然每个应用程序有独立的数据拷贝,但是它们的代码是共享的。 C++ 库会涉及到三个东西:.h .lib .dll文件。 库的使用方式有三种: 1&gt;. .h + .lib 2&gt;. .dll 3&gt;. .h + .li...

  • C++方式实现stl、obj、3DS三种3D模型加载,并实现Arcball方法控制旋转缩放平移(采用glut库等文件,具体可在项目文件中实现),开发软件为VS2019

    获取建模得到的三维模型并解析 STL****文件 STL (STereoLithography, 立体光刻)是由3D Systems软件公司创立、原本用于立体光刻计算机辅助设计软件的文件格式。它有一些事后诸葛的字头语如“标准三角语言(Standard Triangle Language)”、“标准曲面细分语言(Standard Tessellation Language)”、“立体光刻语言(STereolithography Language)”和“(立体光刻曲面细分语言)”。许多套装软件支持这种格式,它.

  • C/C++中的Obj文件

    project中每个cpp经编译成为obj(object)文件,所有obj文件和资源文件经链接(link)成为可执行文件,obj文件可称为目标文件或中间文件。另外,obj文件只给出了程序的相对地址,而EXE是绝对地址。

  • 笔记77:理解C++中头文件和源文件的作用【程序编译过程】

    很显然,答案是不可能。但是有一个很简单地办法,可以帮助程序员们省去记住那么多函数原型的麻烦:我们可以把那几百个函数的声明语句全都先写好,放在一个文件里,等到程序员需要它们的时候,就把这些东西全部 copy 进他的源代码中。这个方法固然可行,但还是太麻烦,而且还显得很笨拙。于是,头文件便可以发挥它的作用了。所谓的头文件,其实它的内容跟 .cpp 文件中的内容是一样的,都是 C++ 的源代码。但头文件不用被编译。

  • C++ 对象——分析目标文件(.obj 或 .o 文件)

    理解目标文件的结构和生成过程对于掌握 C++ 的编译和链接机制至关重要。使用 `dumpbin` 工具可以有效分析目标文件的内容,帮助开发者调试和优化程序。

  • VC++检测可执行程序DLL、EXE等是32位还是64位

    1.首先介绍PE结构    Windows系统下的可执行文件,是基于Microsoft设计的一种新的文件结构,此结构被称之为PE结构。PE的意思是Portable Executable(可移植的执行体),所有Win32执行体都是用PE文件格式,其中包括SYS、DLL、EXE、COM、OCX等。(不管是学习逆向、破解还是安全,了解PE文件格式都是非常必要的。)    PE文件的第一个部分是IMAGE

  • C++中的头文件

    一、C++编译模式通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是C++的源代码。C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是相对独立的,

  • 【C++】Vscode 中不使用CMakeLists构建C++项目:项目结构、各个文件夹作用、从编码到debug一体化

    首先要明白,vscode只是一个记事本,本身是不能够进行任何程序语言开发的。只不过这个记事本可以安装插件,可以和命令行程序结合起来使用,使得它可以进行开发。 一、Vscode下C++项目的目录结构 首先,类似于我们在IDEA中新建一个普通java项目,项目的目录结构是这样的: 新建一个maven模板的java项目,项目的目录结构是这样的: 构建一个web模板的java项目,项目的目录结构是这样的: 用springboot模板构建一个java项目,项目的目录结构是这样的: 对于C++.

  • c语言中各文件的作用,C语言的文件概念

    C语言的文件概念引导语;文件的范畴很广泛,电脑上运行的程序、杀毒等等都叫文件。以下是百分网小编分享给大家的C语言的文件概念,帮助大家学习C语言基础知识,欢迎阅读!文件的基本概念所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是驻留在外部介质(如磁盘等)上的, 在...

  • C语言中的文件是什么?

    C语言中的文件是什么? 1,文件的主要作用是保存数据 2,操作系统中、不同的硬件设备也看做一个文件,对硬件设备文件的操作、等同于对磁盘上普通文件的操作。 如: 把键盘作为标准输入文件、把显示屏输出内容作为标准输出文件 3,常见的硬件设备所对应的文件: 文件 硬件设备 stdin 标准输入文件 如键盘 stdout 标准输出文件 如显示器 stde...

  • 软工各个文档作用

      一,可行性研究报告 编写时间段:在研发项目之前 主要内容:分析主要的方法,对本项目的实施的可能性,有效性技术方案及技术政策进行具体,深入,细致的技术论证和经济评价。 作用:分析项目是否具有开发的必要性和可行性,并确定最佳方案 阅读的人员:系统管理人员开发与运维人员 二,项目开发计划书 主要内容:参加人员已经各种资料的需求,制定项目开发进度验收标准和成本概算等,,以文本的形式记载下...

  • Visual C++中各种文件的作用(详细)

    参考:http://blog.sina.com.cn/s/blog_6975d67c0100r3kx.html DSW:全称是Developer Studio Workspace,最高级别的配置文件,记录了整个工作空间的配置信息,她是一个纯文本的文件,在vc创建新项目的时候自动生成 DSP:全称是Developer Studio Project,也是一个配置文件,不过她记录的是一个项目...

  • 编译.cpp文件为.obj文件成功后,要将所有的obj文件连接成为.exe文件

    编译.cpp文件为.obj文件成功后,要将所有的obj文件连接成为.exe文件。这时出错原因通常有3个:1 。某个函数,在不同的cpp文件中有重复的定义,即有2个函数体的实现; 2.调用某个函数时,无法确定调用哪个,即函数参数类型或个数无法匹配; 3.动态性声明错误如果在类定义(.H文件)中声明了使用动态性,则在类实现部分(.cpp文件)要加相应的说明,如正方形类的序列化声明://Square...

  • 彻底搞懂一个项目中的各种文件关系

    一个项目由很多文件构成,很多.c文件,和.h文件。 .h文件,只是头文件中的包含的作用,就是copy。 编译的时候,各个.c文件分别进行编译。 如果一个.c文件中的变量,使用之前是用extern修饰的,那么表明这个变量不是本文件中的,是别的文件中的。extern 表示外部的意思,就是表明这个变量或者函数,不是本文件中的,是其他.c文件中的。各个.c文件都编译后,需要进行链接的。 重要的补充说明: 头文件中不可以有可执行的代码! 什么叫可执行代码,自己去Google。 否则,如果头文件中有可执行代码,那么如

  • 对于编译原理的理解

    编译原理 今天组长教育了一下整个程序的编译过程,感觉自己对于这块了解还是很少,有许多知识之前知道,现在忘记了,还有很多规则只是知道,但并不知道它为什么要这样写,所以再次记录一下,有什么问题或者错误希望大家在评论区提出。。。。 编译原理 如图 预编译阶段 在预编译阶段,发挥作用的是预处理器(CPP)。预处理器读取.cpp文件,对其中的伪指令(#开头的指令)和特殊符号进行处理,...

  • c++编译 (.obj, .lib, .dll, .exe的关系(附:lib和DLL的区别))

    转载原网址 c++程序在编译后,在目标路径下会生成多个文件: Debug文件夹(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg *.exe:是生成的可执行文件 *.ilk:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息 *.obj:是目标文件,源程序编译后的产物 *.pch:全称是PreCompiled Header,就是预先编译好的头文件 *.idb:文件保存的信息,使编译器在重新编译的时候只重编译最新

  • 理解C++中的头文件和源文件的作用

    一、C++编译模式 通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是C++的源代码。 C+ +语言支持“分别编译”(separatecompilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是相对独

Global site tag (gtag.js) - Google Analytics