歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

Node.js connect 安裝、介紹與實例

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_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


在浏覽器地址欄輸入 http://localhost:8080/?name=zhang,結果如下


就寫到這,後面再寫一些connect的應用。

Copyright © Linux教程網 All Rights Reserved