为什么connect接受第三个参数,如何传入它

时间:2016-09-23 04:01:59

标签: node.js express connect

我读了connectJS的source code,这部分让我感到困惑

function createServer() {
  function app(req, res, next){ app.handle(req, res, next); }
  merge(app, proto);
  merge(app, EventEmitter.prototype);
  app.route = '/';
  app.stack = [];
  return app;
}
module.exports = createServer;

基本上next是内部堆栈耗尽时的最终处理程序 app应该直接转到http.createServer接受长度为2的函数。但是app声明接受3个参数。那么传递第三个参数的位置?

对于任何人阅读源代码,重点应该是明确的。如果从未阅读过源代码,我强烈建议您阅读它,它很短。然后,可以回到这个问题

1 个答案:

答案 0 :(得分:0)

对于那些关心的人,我找到了这个问题的答案 我们可以做这样的事情

var connect=require('connect')();

var http=require('http')

http.createServer(function (req,res) {
    connect(req,res,function() {
        console.log("I am next")
    })
})

通过这种方式,我们可以传递next作为最终处理程序

通常我们使用

var connect=require('connect')();

var http=require('http')

http.createServer(connect)

忽略连接框架的隐藏功能

此外,由于某种原因,此功能不会放入their document

=========================== update =================== ==============

在连接中阅读了一些测试用例后,更好地理解了为什么存在

 it('should work as middleware', function(done){
    // custom server handler array
    var handlers = [connect(), function(req, res, next){
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end('Ok');
    }];

    // execute callbacks in sequence
    var n = 0;
    function run(req, res){
      if (handlers[n]) {
        handlers[n++](req, res, function(){
          run(req, res);
        });
      }
    }

    // create a non-connect server
    var server = http.createServer(run);

    request(server)
    .get('/')
    .expect(200, 'Ok', done);
  });

就像next可以作为在连接中的堆栈中向前移动的信号一样,框架级中的next可以链接到另一个框架,但是,没有明显的链接方式中间件一起在connect.Maybe express可以利用这个隐藏的功能更多