写给 Node.js 学徒的 7 个建议

一些我更愿意在开始就知道东西利用 Node.js 开发是一个很是有趣,和使人知足的过程, 它有3万多个模块能够选择使用,而且全部的模块能够很是容易的集成入现有的应用之中。

不管如何,对于一些刚开始使用Node.js 开发的的人来讲, 很容易碰壁,在这个文章中,我会提到在你学习过程当中遇到的问题。

贴士 1: 在开发环境使用 nodemon, 在生产环境使用pm2
当你第一次开发Node.js应用的时候, 其中一件事情就是一次又一次的运行[file].js 就和揭伤疤同样。 当我第一次开发的node app时候,这个让我感到异常挫败和痛苦, 尤为是每当我修改很小东西的时候须要control+c

幸运的是我发现了一个很是棒的工具Nodemon。 你能够利用如下的命令来安装javascript

  1. npm install -g nodemonjava

复制代码node

Nodemon 是一个使人惊叹的工具, 当你全局安装它之后, 能够经过 nodemon [file].js 来启动你的node.js scripts,它会告诉nodemon来监视你的script和scripts的全部变化, 这样的Node.js开发方式很是震撼以及让大大提升开发速度。

那么,生产环境又如何, 除非你用了heroku,Nodejitsu或者其它一些好的 Node.js 平台(也许它们有相似的功能), 可是碰巧你用了EC2 或者一些其它的云平台来运行你的Node.js app, 你如何能然保证这是一个始终运行的Node.js app

案就是PM2, PM2 是一个相似于Nodemon的工具,不一样之处在于它用于生产环境, 和Nodemon类似的地方在于它会监控你的app的任何修改或者从新部署,可是有更好的一面, PM2 在遭遇到崩溃的时候,它会正确重启你的app。

PM2的优胜之处在于当你要将app须要多核处理的时候,PM2内部集成的负载均衡可让你很容易的去指定运行多少个实例。git

  1. pm2 start app.js -i maxgithub

复制代码web

-i参数目的是指定运行多少个实例,在这个例子中 PM2 使用了一个常量max来扩展你的app运转到你最大的核数,不要忘记Node 平时只会运行在单核!

贴士 2: Async 或者 Q
当你专一于写了更多的node.js apps的时候,你确定领略了什么是回调地狱。 若是你还不知道,这里有一个例子:redis

  1. function register(name, password, cb){
    chrome

  2.   checkIfNameExists(name, function(err, result){
    npm

  3.    if(err){
    json

  4.     return cb(“error”);

  5.    }

  6.    checkIfPasswordGood(password, function(err, result){

  7.     if(err){

  8.      return cb(“error”);

  9.     }


  10.     createAccount(name,password, function(err,result){

  11.      if(err){

  12.       return cb(“error”);

  13.      }

  14.      createBlog(name, function(err, result){

  15.       sendEmail(name, function(err, result){

  16.        callback(result);

  17.       });

  18.      });

  19.     });

  20.    });

  21.   });

  22. }

复制代码

这显然不是一个有用或者使人折服的代码, 反而进入一种回调地狱般两难的境地,是你的话将如何避免

一个简单的办法是使用events, 可是我我的不建议这么作,由于使用events来调用只有一个用途的私有方法,足以使人受挫

因此你该怎么作 这里有两个编译好的模块,async.js和Q, 它们两个均可以防止落入回调地狱

Async.js或者 ‘async’ 让你能够容易的执行一些连续或者平行的任务,在不依赖一个又一个的嵌套循环前提下。

下面是一些来自Async的readme,写明了它支持的模式, 如需获取所有的支持方式请去它们的github主页查看。

  1. async.map([‘file1',’file2',’file3'], fs.stat, function(err, results){

  2.   // results is now an array of stats for each file

  3. });


  4. async.filter([‘file1',’file2',’file3'], fs.exists, function(results){

  5. // results now equals an array of the existing files

  6. });


  7. async.parallel([

  8.   function(){ … },

  9.   function(){ … }

  10.   ], callback);


  11. async.series([

  12.   function(){ … },

  13.   function(){ … }

  14.   ]);


  15. async.waterfall([

  16.   function(callback){

  17.    callback(null, ‘one’, ‘two’);

  18.   },

  19.   function(arg1, arg2, callback){

  20.    callback(null, ‘three’);

  21.   },

  22.   function(arg1, callback){

  23. // arg1 now equals ‘three’

  24. callback(null, ‘done’);

  25. }

  26. ], function (err, result) {

  27. // result now equals ‘done’ 

  28. });

复制代码

若是咱们用async的waterfall来修改以前的例子,结果将更加容易阅读, 不再用让你的代码看起来像一个死亡金字塔。

另外一个重要的库叫作Q。 这个库是一个暴漏promises的概念, Promise 是一个含有’promise’方法的返回对象,它提供了一个最终的返回值,很是优雅的将javascripts的异步和node.js紧密联系在一块儿。

For example, taken from Q’s repo page.

  1. promiseMeSomething()

  2. .then(function (value) {

  3. }, function (reason) {

  4. });

复制代码

这个 promise me 方法 正确返回了一个对象, 对象将在传入value的时候调用这个方法当,而且它提供了一个额外的callback来处理失败后的返回值

这是一个很是有条理的方式来避免回调地狱,若是你重写咱们以前的那个例子,你能够很是容易的让这些函数正确被调用并执行。

就和我以前说的同样, 我很不肯建立只有一个用途的一堆功能,相反的在’then’以后传入一个方法名,仅仅建立了一个匿名的内部功能和传递,固然了选择权始终在你手里。

总的来讲,当你落入回调地狱的时候,是时候去看看 async.js或者Q吧。

个人选择 固然是 Q

贴士 3: 轻松调试 Node.js apps
若是你从一个IDE重度集成的语言好比java 或者C# 转来调试Node.js, 你必定会感到很困扰, 大部分新加入node的开发者采用了’flow’的调试模式,从这一刻开始你最好的朋友就是console.log

可是依然有更常见的调试方式来代替, Node.js 内置了一个调试器你能够称为 node debug, 不过我更喜欢的 node-inspector

它们的github说 “Node Inspector 是一个使用Blink Developer Tools (之前称为WebKit Web Inspector)node.js调试器的界面,”简而言之,node-inspector 可让你用任何你想用的编辑器和chrome web tools来调试你的应用,这是多么的性感。

Node-inspector 可让你作一些很是酷的事情,好比实时修改,单步调试,注入以及一堆其它很是酷的东西。

让咱们来根据指示一步一步安装
https://github.com/node-inspector/node-inspector

贴士 4: Nodefly
一旦你有你的应用程序正常运行,你可能会问本身,你怎么能够监视它的性能和配置文件,以确保您的应用程序运行在最佳的速度。最简单的答案是一个卓越的服务,我称为Nodefly。

用简单的一行代码Nodefly开始监视你的应用程序内存泄漏,测量redis用了多久,mongo查询和一堆其它很酷的东西。http://www.nodefly.com

贴士 5: 利用NPM进行模块管理
Node作最多见的事情之一是经过NPM安装软件包。Node有一个惊人的包管理器安装全部指定在你的package.json的manifest文件中的模块。然而,全部初学者都会碰上保持的package.json文件中您所使用的全部的模块都是最新版。

这彷佛是一个痛苦的过程,老是打开的package.json来更新新模块的依赖,但许多人不知道的是npm会为你作这个!

很是简单运行 npm install – save module_name 而后 npm将自动更新你的package.json 包含正确的模块和版本,

  1. npm install - save module_name

复制代码


贴士 6: 不要检查node_modules 文件夹

虽然咱们的话题一直是modules和npm,可是并非不是不少人都知道,你不该该提交node_modules文件夹。这背后最大的缘由是,没有必要提交这个文件夹。只要有人下载你的代码,它们可经过运行NPM来安装和下载全部须要的模块。

您可能会说,它是否是一个大问题,若是检查node_modules,可是,若是下载代码的人使用了和你编译modules不同的操做系统的来安装经过NPM?你的应用程序将会崩溃,下载代码的人将不知道为何会如此!

举个例子bcrypt以及sentimental若是当在您安装在主机系统上编译它们,由于它们用了本地C语言组件来编译。避免检查node_modules文件夹的方式是加入.gitignore

  1. // .gitignore node_modules/*

复制代码


贴士 7: 别忘记返回

初学者常常犯一个很常识的错误,就是忘记callback后的返回值,虽然有些时候,这没有影响,有不少时候,你会遇到奇怪的问题,由于你的回调被调用两次。

让咱们看一个简单的例子

  1. function do(err,result, callback){

  2.    if(err){

  3.       callback(“error”);

  4.   }

  5.   callback(“good”);

  6. }

复制代码

乍一看,这个片断是有道理的。若是有错误,在回调中发送“错误。若是不发送return,调用callaback后这个函数不会停下来。它只是将移动到调用回callback(“good”)。这样作在长期和复杂的代码行里面会节省几个小时的调试。

相关文章
相关标签/搜索