【问题标题】:Why connect accept a third parameter,how to pass it in为什么连接接受第三个参数,如何传入
【发布时间】:2016-09-27 14:26:17
【问题描述】:

我看了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 应该直接去 for http.createServer 接受长度为 2 的函数。但是 app 声明接受 3 个参数。那么在哪里传递第三个参数?

看过源码的人都明白,如果没看过源码,强烈推荐阅读,很短。然后,可以回到这个问题

【问题讨论】:

  • 酷,酷...您是否还阅读了their documentation 而不是源代码?因为它解释了这种基本行为,因为它是 Sencha 的 connect(以及 Express.js 等衍生项目)中中间件如何工作的基础
  • @Mike'Pomax'Kamermans 当然我做到了,请告诉我一种可以传入next 参数的方法,app 在客户端可以做任何事情之前就已经返回了!!!!
  • @Guigui:反对票是匿名的。我不是 node.js 方面的专家,但你肯定对那些在自己的时间免费帮助你的人有着非常好战的态度。事实上,你的问题不是很清楚:你到底要什么?
  • 如果您认为我回答了错误的问题(当然,我可能是),请更新您的帖子,以便更明确地说明您需要回答的内容。现在您的问题似乎是“我如何传递next?”,这是基本的 Connect/Express 行为并且有据可查。就您显示的源代码而言,行为似乎很明显:函数app 被定义为具有您的参数,并在定义后立即附加到handle 上。然后EventEmitter.prototype 被拍打得很好。
  • 那么请更新您的问题以解释这是您如何理解在您的问题中工作的源代码(不是在 cmets 中,我不是唯一一个在看它的人,当然也不是只有一个你希望有可能回答它的人),以及为什么你认为这是基于其他代码,尽管你预期的跟踪,但这并不是正在发生的事情。这样,您可能会从更多人那里得到更好的答案。我需要走出去,但祝你好运。作为建议:删除炎症性 cmets 是个好主意。他们不帮助获得答案,但确实帮助搁置问题。

标签: node.js express connect


【解决方案1】:

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

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)

忽略connect框架的隐藏特性

另外,这个功能由于某种原因没有放入their document

============================更新=================== ===============

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

 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可以作为一个信号在connect里面的栈中前进一样,一个框架级别的next可以链接到另一个框架,虽然没有明显的方法在connect中将中间件链接在一起.也许express可以更多地利用这个隐藏的功能

【讨论】:

  • 如果不在文档中,则可能会更改,恕不另行通知,我们不得使用它。
  • @NidhinDavid 谢谢,至少这是对这个问题的正确答案,而不是在不了解主题的情况下直接对问题投反对票
  • 我没有拒绝你的问题,也没有人很长时间
  • @NidhinDavid 对此感到抱歉,我有点疯了 :)
猜你喜欢
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多