节点异步路由代码

Posted

技术标签:

【中文标题】节点异步路由代码【英文标题】:Node asynchronous route code 【发布时间】:2014-09-18 19:11:02 【问题描述】:

我正在使用带有 express 4.0 的节点。我在互联网上(包括文档)找不到任何关于在路由中嵌入异步代码的信息。

使用中间件非常简单:

app.use('/something', function (req, res, next)

  doSomethingAsync(function(err, probablySomethingElse)
  
    // probably some error checking
    next();
  );
);

路由的问题是没有next回调,那么express怎么知道什么时候移动到下一个job呢?

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 回调通过了。那么这里发生了什么?它在幕后是如何运作的?我怎样才能把异步代码放在那里?

【问题讨论】:

您能否再清楚一点,您想在路由中放入什么异步代码,以及与所有路由恰好都有的next 回调有什么关系。 当你res.render()某事时,你不需要调用next()(即使它被传递了,如果你想可以),因为它是链的末端 Express 不知何故需要知道我的回调何时退出,以便它可以关闭套接字并删除与此请求关联的数据。我是否理解正确,如果我调用res.render,它会假定没有安排异步任务并且它不必等待next 被调用? 【参考方案1】:

Express 将等到您调用 res.render 来关闭套接字。这意味着您可以将 res.render 传递给一个需要 X 秒执行的回调,并且一切仍然有效。

next 可以让你走下一条映射你的价值的路线,你可以在这里找到一个很好的解释:What is the parameter "next" used for in Express?

但是根据您在这里的要求。在res 对象上调用render() 的那一刻,将发送数据并关闭套接字。

【讨论】:

以上是关于节点异步路由代码的主要内容,如果未能解决你的问题,请参考以下文章

反应路由器基本代码拆分(获取第一个块,然后在后台异步获取其他块)

如何使用 HERE 中的异步矩阵路由 API v8 来获取包括交通在内的行程时间响应

vue 异步组件

vue异步组件

VueRouter 路由钩子与异步请求

webpack性能优化:分隔/分包/异步加载+组件与路由懒加载