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)
});
});