我读了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个参数。那么传递第三个参数的位置?
对于任何人阅读源代码,重点应该是明确的。如果从未阅读过源代码,我强烈建议您阅读它,它很短。然后,可以回到这个问题
答案 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可以利用这个隐藏的功能更多