2014-07-27 55 views
7

我正在使用Express 4.0的节点。我无法在Internet上找到任何关于在路由中嵌入异步代码的文档(包括文档)。节点异步路由代码

随着中间件它很简单:

app.use('/something', function (req, res, next) 
{ 
    doSomethingAsync(function(err, probablySomethingElse) 
    { 
    // probably some error checking 
    next(); 
    }); 
}); 

与路线的问题是,有没有next回调,所以确实提出了如何知道什么时候移动到下一个工作吗?

app.get('/something', function (req, res) 
{ 
    res.render('someTemplate'); 
    // no next() here, but it still works 
}); 

如果我不得不猜测,我会说express在上述函数退出后立即移动到下一个任务。但是,出于好奇,我已经推出了下面的代码...

app.get('/something', function (req, res, next) 
{ 
    console.log(next); 
}); 

...,实际上有一些next回调过去了。那么这里发生了什么?它在幕后如何工作?我怎么能把异步代码放在那里?

+0

你可以更清楚一点,你想在路由中放入什么样的异步代码,以及与下一个回调有关的所有路由是如何发生的。 – adeneo

+1

当你调用'res.render()'的时候,你不需要调用next()(即使它被传递,所以你可以*如果你想的话),因为它是链的**端**。 – Bergi

+0

Express以某种方式需要知道我的回调何时退出,因此它可以关闭套接字并删除与此请求关联的数据。我是否理解正确,如果我调用'res.render',它会假定没有安排异步任务,并且不需要等待'next'被调用? –

回答

5

Express会一直等到您致电res.render才能关闭插座。这意味着您可以将res.render传递给需要X秒执行的回调,并且所有内容都将继续工作。

next允许你去映射你的价值在未来的路线,你可以在这里找到一个很好的解释:What is the parameter "next" used for in Express?

但在你问这里。在res对象上调用render()时刻,然后将发送数据并关闭套接字。