Node 入门笔记

Posted by Gemicat on November 23, 2015

Node快速上手

1 搭建HTTP服务器

不同于PHP需要配置Apache服务器,Node内置服务器组建:

//server.js
var http = require("http");
http.createServer(function (req, res) {
    res.writeHead(200, {"Content-Type": "text/html"});
    res.write('<h1>Node.js</h1>');
    res.end('<p>hello world</p>')
}).listen(3000);
console.log("HTTP server is listened port 3000");

使用浏览器访问 127.0.0.1:3000 即可访问。当程序代码改动时,需要重启服务器。

小技巧。使用supervisor即可边改边看到效果 $ npm install -g supervisor

使用supervisor命令启动server.js

$ supervisor server.js

2 异步I/O和时间式编程

2.1 阻塞与非阻塞

如果线程在执行中遇到I/O操作,通常要耗费相当长的时间,这是操作系统就会剥夺这个线程的CPU控制权,使其暂停执行,同时将资源让给其他线程执行。这种线程调度的方式成为阻塞。

而NodeJS使用的非阻塞I/O则是遇到I/O操作时,将请求发送给操作系统,继续执行下一个事件,当操作系统完成I/O操作时,以事件的方式通知执行I/O操作的线程。

2.2 回调函数

下面是Node中异步读取文件的例子:

var fs = require('fs');
fs.readFile('file.txt', 'utf-8', function (err, data) {
    if (err) {
        console.log(err);
    } else {
        console.log(data);
    }
});
console.log('end');

输出:

end Content of File

虽然Node提供了一部分同步操作的接口,但是不建议使用。

2.3 事件

Node所有异步I/O操作在完成时都会发送一个事件到事件队列,事件是由EventEmitter对象提供的:

var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();

event.on('some_event',function(){
    console.log("event");
});

setTimeout(function(){
    event.emit('some_event')
},1000);

这段代码在1秒后输出 “event”。原理是event对象注册了 some_event 事件的监听器,setTimeout在1秒后向event对象发送事件 some_event。