解惑node中的单线程

这里说一下node.js中的单线程缘由还是基于前段时间公司内部培训同事提出的问题:在网络通讯编程中,按照以往的语言或平台,应对成百上千的socket连接时,往往都会利用多线程的特性,对每个连接开启子线程分别接收数据再处理。那么在node.js中它是单线程,是基于事件响应的,即将每个的连接、处理事件会放到一个事件队列里面依次处理。那么问题来了,同事说如果某一个连接上来以后,一直在给服务器发送数据,那么排在事件队列后面的连接怎么处理,会一直等待吗?这个当然不是,下面我先用一个例子来说明一下这个问题的答案,方便理解。

我们准备模拟这样一个场景:一个客户端向服务器发起tcp连接,成功之后,客户端一直给服务器发送数据,而服务器收到数据后只是作一个回显。然后,我们再用一个客户端向该服务器发起tcp连接,同样发送数据,这时看服务器会不会因为接收上一个连接的持续发送数据,而不能去处理第二个tcp连接的数据发送。

Read More

node中异步回调解决方案之promise

以前在其他开发平台写码习惯了同步的写法,现在切换到node.js里面的异步特性,还是有一点的不习惯,起初还不怎么觉得,但当遇到数据库的操作,并且需要其返回的数据作下一步的逻辑时,问题就出来了,后面的逻辑都会写在前一个异步的回调里面,如此炮制,最后的结果就是一个金字塔似的回调噩梦就产生了。

那么如何解决这样的噩梦呢?其实不管是网上还是其他渠道的资料上都有其针对异步的解决方案,而我是在看了张丹老师的博文后,决定尝试使用asyn库,并且应用在了实际的项目中来,效果不错。而今天我要笔记的是另外一种异步的解决方案-promise。

Read More

npm install经常失败解决方法

之前在使用node.js的好基友npm包管理器install模块的时候,间断性的失败,而且是屡试不爽,后来网上了解到和我有相同遭遇的朋友们不在少数。原因就在于npm包管理服务器在米国,而我们有骄傲的GFW,故导致上述install不稳定的情况。所以,为了更好的使用体验采用了淘宝的 NPM 镜像,它是一个完整的npmjs.org镜像。

*1.通过定制的 cnpm 命令行工具代替默认的 npm

1
npm install -g cnpm --registry=http://registry.npm.taobao.org

*2.安装具体模块

1
cnpm install [name]

tips:当安装的时候发现安装的模块还没有同步过来, 淘宝 NPM 会自动在后台进行同步, 并且会让你从官方 NPM registry.npmjs.org 进行安装. 下次你再安装这个模块的时候, 就会直接从 淘宝 NPM 安装了.

*3.同步模块(直接通过 sync 命令马上同步一个模块)

1
cnpm sync connect

node-schedule的使用说明

这篇笔记内容很简单,就只是记录一下node-schedule的使用方法,特别是在初始化一个定时任务时,需要传递的参数的写法含义。

先看一段代码:

1
2
3
4
5
6
7
8
9
var schedule = require('node-schedule');

function createScheduleCron(){
schedule.scheduleJob('30 * * * * *', function(){
console.log('excute scheduleCronstyle:' + new Date());
});
}

createScheduleCron();

Read More

node.js中module.exports与exports的区别

我们在阅读它人或开源的node.js代码时,会发现在对模块导出的写法上会出现下面几种情况,而关于导出的方法整理,可以参见我这篇文章node.js中exports的用法整理。现在,我们以导出字符串对象为例:

在module.js文件中,有如下写法:

  • 1.exports.get_name = ‘fungwan by exports ‘;
  • 2.module.exports.get_name = ‘fungwan by modules’;
  • 3.module.exports = ‘fungwan by modules’;

通过对比发现,这里较之前多了module.exports,那么它跟exports的导出有什么关系呢?查阅资料即可知晓,其实exports就是module.exports对象的引用,本质上是相等的。我们可以通过这句代码证实:

Read More