歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Node.js connect 安裝、介紹與實例

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

日期:2017/2/28 15:57:25   编辑:Linux教程

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. // expose createServer() as the module
  3. exports = module.exports = createServer;
  4. function createServer() {
  5. if ('object' == typeof arguments[0]) {
  6. return new HTTPSServer(arguments[0], Array.prototype.slice.call(arguments, 1));
  7. } else {
  8. return new HTTPServer(Array.prototype.slice.call(arguments));
  9. }
  10. };
  11. fs.readdirSync(__dirname + '/middleware').forEach(function(filename){
  12. if (/\.js$/.test(filename)) {
  13. var name = filename.substr(0, filename.lastIndexOf('.'));
  14. exports.middleware.__defineGetter__(name, function(){
  15. return require('./middleware/' + name);
  16. });
  17. }
  18. });
  19. 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(this, this.handle);
  7. };
  8. Server.prototype.__proto__ = http.Server.prototype;
  9. Server.prototype.use = function(route, handle){
  10. ...
  11. this.stack.push({ route: route, handle: handle });
  12. // allow chaining
  13. return this;
  14. };
  15. Server.prototype.handle = function(req, res, out) {
  16. ...
  17. function next(err) {
  18. ...
  19. layer = stack[index++];
  20. ...
  21. var arity = layer.handle.length;
  22. if (err) {
  23. if (arity === 4) {
  24. layer.handle(err, req, res, next);
  25. } else {
  26. next(err);
  27. }
  28. } else if (arity < 4) {
  29. layer.handle(req, res, next);
  30. } else {
  31. next();
  32. }
  33. ...
  34. next();
  35. }

看了最簡單的中間件 middleware/query.js,基本就明白,使用js動態語音特性,動態賦屬性。

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

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. function Server(requestListener)

寫一個簡單的實例 hello world

代碼如下,保存為 connectTest.js,放在敲安裝命令 的目錄下:

[javascript]
  1. var connect = require('connect');
  2. var app = connect()
  3. .use(connect.query())
  4. .use(function(req, res){
  5. var name = req.query.name;
  6. res.end("hello " + name);
  7. });
  8. app.listen(8080);
  9. console.log('Server started on port 8080');
命令行輸入 node connectTest.js


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


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

Copyright © Linux教程網 All Rights Reserved