一些我更愿意在开始就知道东西

利用 Node.js 开发是一个非常有趣,和令人满足的过程, 他有3万多个模块可以选择使用,并且所有的模块可以非常容易的集成入现有的应用之中。

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

贴士 1: 在开发环境使用 nodemon, 在生产环境使用pm2

当你第一次开发Node.js应用的时候,其中一件事情就是一次又一次的运行[file].js 就和揭伤疤一样。 当我第一次开发的node app时候,这个让我感到异常挫败和痛苦, 尤其是每当我修改很小东西的时候需要control+c

幸运的是我发现了一个非常棒的工具Nodemon. 你可以利用以下的命令来安装。

npm install -g nodemon

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内部集成的负载均衡可以让你很容易的去指定运行多少个实例。

pm2 start app.js -i max

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

贴士 2: Async 或者 Q

当你专注于写了更多的node.js apps的时候,你肯定领略了什么是回调地狱。如果你还不知道,这里有一个例子:

function register(name, password, cb){
checkIfNameExists(name, function(err, result){
if(err){
return cb(“error”);
}
checkIfPasswordGood(password, function(err, result){
if(err){
return cb(“error”);
} createAccount(name,password, function(err,result){
if(err){
return cb(“error”);
}
createBlog(name, function(err, result){
sendEmail(name, function(err, result){
callback(result);
});
});
});
});
});
}

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

一个简单的办法是使用events, 但是我个人不建议这么做,因为使用events来调用只有一个用途的私有方法,足以令人受挫。所以你该怎么做? 这里有两个编译好的模块async.jsQ, 他们两个都可以防止落入回调地狱。

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

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

async.map([‘file1',’file2',’file3'], fs.stat, function(err, results){
// results is now an array of stats for each file
}); async.filter([‘file1',’file2',’file3'], fs.exists, function(results){
// results now equals an array of the existing files
}); async.parallel([
function(){ … },
function(){ … }
], callback); async.series([
function(){ … },
function(){ … }
]); async.waterfall([
function(callback){
callback(null, ‘one’, ‘two’);
},
function(arg1, arg2, callback){
callback(null, ‘three’);
},
function(arg1, callback){
// arg1 now equals ‘three’
callback(null, ‘done’);
}
], function (err, result) {
// result now equals ‘done’
});

如果我们用async的waterfall来修改之前的例子,结果将更加容易阅读, 再也不用让你的代码看起来像一个死亡金字塔.

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

promiseMeSomething()
.then(function (value) {
}, function (reason) {
});

这个 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.jsonmanifest文件中的模块。然而,所有初学者都会碰上保持的package.json文件中您所使用的所有的模块都是最新版。

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

非常简单运行 npm install - save module_name 然后 npm将自动更新你的package.json 包含正确的模块和版本。

npm install - save module_name

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

虽然我们的话题一直是modules和npm,但是并不是不是很多人都知道,你不应该提交node_modules文件夹。这背后最大的原因是,没有必要提交这个文件夹。只要有人下载你的代码,他们可通过运行NPM来安装和下载所有需要的模块。

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

举个例子bcrypt以及sentimental如果当在您安装在主机系统上编译他们,因为他们用了本地C语言组件来编译。

避免检查node_modules文件夹的方式是加入.gitignore

// .gitignore node_modules/*

贴士 7: 别忘记返回

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

让我们看一个简单的例子

function do(err,result, callback){
if(err){
callback(“error”);
}
callback(“good”);
}

乍一看,这个片段是有道理的。如果有错误,在回调中发送“错误。如果不发送return,调用callaback后这个函数不会停下来。它只是将移动到调用回callback(“good”)

这样做在长期和复杂的代码行里面会节省几个小时的调试。

写给Node.js新手的7个小技巧的更多相关文章

  1. Node.js新手必须知道的4个JavaScript概念

    如果只需要知道一种编程语言就可以构建一个全栈的应用程序,是不是特别了不起?Ryan Dahl为了把这个想法成为现实,创造了node.js.Node.js是建立在Chrome强劲的V8 JavaScri ...

  2. 转载--- 写给Node.js学徒的7个建议

    贴士 1: 在开发环境使用nodemon,在生产环境使用pm2 当你第一次开发Node.js应用的时候, 其中一件事情就是一次又一次的运行[file].js 就和揭伤疤一样. 当我第一次开发的node ...

  3. Node.js新手教程——怎样实现文件上传功能

    作者:zhanhailiang 日期:2014-11-16 本文将介绍怎样使用Node.js实现文件上传功能. 1. 初始化项目信息:npm init [root@~/wade/nodejs/node ...

  4. 一个node.js图片上传显示小应用

    文件结构如下: 实现的功能有: 可以通过浏览器使用. 当请求http://domain/start时,可以看到一个欢迎页面,页面上有一个文件上传的表单. 用户可以选择一个图片并提交表单,随后文件将被上 ...

  5. 基于node.js的websocket上传小功能

    一.node.js 在目录里新建index.js var ws = require("nodejs-websocket"); console.log("开始建立连接... ...

  6. 使用node.js中遇到的一些小bug

    1.BUG Cannot set headers after they are sent to the client 解决:即发出一次请求得到两次或以上的回应时会出现此警告,此时注意查看再在一些条件下 ...

  7. js的一些实用的小技巧

    1.移动端自适应: 移动端的编写首先需要在header写入以下内容来表示页面是以不缩放的形式展示的: <meta name="viewport" content=" ...

  8. JS Math对象中一些小技巧

    JS中快速获取数组中最大/最小值 var a=[1,2,3,5]; alert(Math.max.apply(Math, a));//最大值 alert(Math.min.apply(Math, a) ...

  9. JS开发中常用的小技巧

    1.获取指定范围内的随机数 1 2 3 function getRadomNum(min,max){     return  Math.floor(Math.random() * (max - min ...

随机推荐

  1. 无状态服务(stateless service)

    一.定义 无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本 ...

  2. Eclipse UML插件Green UML、AmaterasUML

    一.Green UML插件 1.查看Eclipse版本 查看当前电脑上安装的Eclipse版本(Help-About Eclipse Platform),是3.3.2版本的. 2.查看相应插件版本 然 ...

  3. 设置presentVC跟PushVC一样的效果即从右到左的动画

    SettingViewController *VC = [[SettingViewControlleralloc]init]; VC.view.backgroundColor = [UIColorwh ...

  4. ubuntu 安装compiz后 黑屏无法进入处理

    因为我们显卡的原因而出现不兼容,设置之后会出现菜单栏消失.窗口假死等现象,请保持平静心态,默默重启,如果发现进不去桌面了,可以试试Ctrl+Alt+F1进入字符界面,输入以下命令: dconf res ...

  5. $(document).ready() 与 window.onload的区别

    1.执行时间 window.onload 必须等到页面内所有元素(包括图片 css js等)加载完毕后才会执行. $(document).ready() 是DOM结构绘制完毕后就执行,不必等到所有元素 ...

  6. C#多字符分割

    string demo = "0 1 2 3";string[] result = demo.Split(" ,,".ToCharArray());试试,中间的 ...

  7. ZOJ 3407 Doraemon's Cake Machine [数学]

    题意: 最多有2000组测试样例,每组样例代表n,m; n代表要把蛋糕平分的份数,m代表必须进行多少次操作. 一共有三种操作 1.竖切   经过蛋糕圆心,将蛋糕整个向下切. 2.横切   平行于蛋糕平 ...

  8. [HDU 5074] Hatsune Miku (动态规划)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5074 题目大意是给你m个note,n个数,得分是v[a[i]][a[i+1]]的总和,如果说a[i]是 ...

  9. isIsomorphic

    超时版: /* Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if t ...

  10. cmd中目录的变更

    1.在同一个盘符下的目录的切换使用cd加空格加子目录进行切换 2.在不同的盘符下进行切换直接使用在当前目录后面加上其他盘符的名称即可