Node js 深入理解 - litonghui/TechBlog GitHub Wiki

Node js 特性:

1. Event-driven Non-blocking I/O

传统的web server多为基于线程模型。你启动Apache或者什么server,它开始等待接受连接。当收到一个连接,server保持连接连通直到页面或者什么事务请求完成。如果他需要花几微妙时间去读取磁盘或者访问数据库,web server就阻塞了IO操作(这也被称之为阻塞式IO).想提高这样的web server的性能就只有启动更多的server实例。

相反的,Node.Js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

典型阻塞是I/O操作查询数据库,查询过程需要当前线程或者进程一直等待,直到数据库层完成查询处理。
  result = query('SELECT * FROM students where number = 1');
  do_with(result);
事件驱动设计方式 相当于查询完成之后结果作为另外函数的参数
  query('SELECT * FROM students where number = 1',function(result){
       do_with(result);
  })

node js 模块:

1. 加载模块

通过文件路径引用模块,在进程启动时预先加载,这些模块可能是第三方或者自己创建模块,其中users 会作为对象暴露给JavaScript,调用其中函数。
 var bodyParser = require('body-parser');
 var users = require('./routes/users');

2. 导出模块

通过对可重要模块封装将类、对象、函数作为公共模块暴露给JavaScript调用
function md5 = function(params, key) {
    let _params = filter(params);
    let signStr = createLinkString(dictSort(_params));
    signStr += key;
    return crypto.createHash('md5').update(signStr, 'utf8').digest('hex');
};
exports.md5 = md5;

module.exports 表示模块向所需脚本导出对象,也可以通过module.exports.md5 导出函数。

node js 中间件

函数能够访问请求对象 (req)、响应对象 (res) 以及应用程序的请求/响应循环中的下一个中间件函数。

1. express 中间件允许基于HTTP 方法和 URL执行不同任务定义路由表,应用程序是用应用层中间件、路由器层中间件、错误处理中间件等。

应用层中间件 使用app.use() 和 app.METHOD() 函数将应用层中间件绑定到应用程序对象的实例,use不区分HTTP请求方法;METHOD 为http方法的get、post 等。

router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

router.use('/photo',function(req,res){
    var page = req.param('page');
    photoprovider.getPhones(page,function(result){
        parsers.resultProc(req,result,res)
    });
});