Node.js connect 安装、介绍与实例

Linux大全评论1.8K views阅读模式

http中间件:connect(sencha实验室的产品)  提供一个类似javaee过滤器的框架,提供了很多中间件,如:日志、静态文件服务器,seesion等功能,官网 https://github.com/senchalabs/connect/ ,使用或看源码推荐看 https://github.com/senchalabs/connect/tree/1.8.4,因为默认首页是2.0版,代码已经重写了,帮助文档 http://senchalabs.github.com/connect/

相关阅读:

http://www.linuxidc.com/Linux/2012-02/53530.htm

http://www.linuxidc.com/Linux/2012-02/53531.htm

开始安装输入npm install connect,要等一会,再输入npm list

Node.js connect 安装、介绍与实例

安装成功。该目录下会生成node_modules文件夹。

有位仁兄对nodejs模块connect源码进行分析,链接http://www.linuxidc.com/Linux/2012-02/53529.htm

我也看了一下源码,不是太复杂,主要是利用javascript的动态语音特性,核心代码片段如下:

connect.js 代码片段,对http进行封装

[javascript]

  1. var HTTPServer = require('./http').Server  
  2.   
  3. // expose createServer() as the module   
  4. exports = module.exports = createServer;  
  5.   
  6. function createServer() {  
  7.   if ('object' == typeof arguments[0]) {  
  8.     return new HTTPSServer(arguments[0], Array.prototype.slice.call(arguments, 1));  
  9.   } else {  
  10.     return new HTTPServer(Array.prototype.slice.call(arguments));  
  11.   }  
  12. };  
  13.   
  14. fs.readdirSync(__dirname + '/middleware').forEach(function(filename){  
  15.   if (/\.js$/.test(filename)) {  
  16.     var name = filename.substr(0, filename.lastIndexOf('.'));  
  17.     exports.middleware.__defineGetter__(name, function(){  
  18.       return require('./middleware/' + name);  
  19.     });  
  20.   }  
  21. });  
  22.   
  23. exports.utils.merge(exports, exports.middleware);  

http.js 代码片段,this.stack 存储了所有的过滤链表,真的非常想java的过滤器,中间件的参数很像java的FilterConfig,   next()很像java的  filterChain.doFilter,可能更像Struts2 提供的默认拦截器栈

[javascript]

  1. var Server = exports.Server = function HTTPServer(middleware) {  
  2.   this.stack = [];  
  3.   middleware.forEach(function(fn){  
  4.     this.use(fn);  
  5.   }, this);  
  6.   http.Server.call(thisthis.handle);  
  7. };  
  8.   
  9. Server.prototype.__proto__ = http.Server.prototype;  
  10.   
  11. Server.prototype.use = function(route, handle){  
  12. ...  
  13.   this.stack.push({ route: route, handle: handle });  
  14.   
  15.   // allow chaining   
  16.   return this;  
  17. };  
  18.   
  19.   
  20. Server.prototype.handle = function(req, res, out) {  
  21. ...  
  22. function next(err) {  
  23. ...  
  24. layer = stack[index++];  
  25. ...  
  26. var arity = layer.handle.length;  
  27.       if (err) {  
  28.         if (arity === 4) {  
  29.           layer.handle(err, req, res, next);  
  30.         } else {  
  31.           next(err);  
  32.         }  
  33.       } else if (arity < 4) {  
  34.         layer.handle(req, res, next);  
  35.       } else {  
  36.         next();  
  37.       }  
  38. ...  
  39.   next();  
  40.  }  

看了最简单的中间件 middleware/query.js,基本就明白,使用js动态语音特性,动态赋属性。

[javascript]

  1. var qs = require('qs')  
  2.   , parse = require('url').parse;  
  3.   
  4. module.exports = function query(){  
  5.   return function query(req, res, next){  
  6.     req.query = ~req.url.indexOf('?')  
  7.       ? qs.parse(parse(req.url).query)  
  8.       : {};  
  9.     next();  
  10.   };  
  11. };  

http.Server.call(this, this.handle); 开始没看懂 ,后来看了 node.js 原本的http.js的代码片段  
node.js,知道什么意思了
[javascript]

  1. exports.createServer = function(requestListener) {  
  2.   return new Server(requestListener);  
  3. };  
  4.   
  5. function Server(requestListener)   

写一个简单的实例 hello world

代码如下,保存为 connectTest.js,放在敲安装命令 的目录下:

[javascript]

  1. var connect = require('connect');  
  2.   
  3. var app = connect()  
  4.   .use(connect.query())  
  5.   .use(function(req, res){  
  6.     var name = req.query.name;   
  7.     res.end("hello " + name);  
  8.   });  
  9.   
  10. app.listen(8080);  
  11. console.log('Server started on port 8080');  

命令行输入 node connectTest.js

Node.js connect 安装、介绍与实例

在浏览器地址栏输入 http://localhost:8080/?name=zhang,结果如下

企鹅博客
  • 本文由 发表于 2019年9月14日 08:33:53
  • 转载请务必保留本文链接:https://www.qieseo.com/209965.html

发表评论