在快速服务器 app.get 中进行异步调用

Mik*_*ler 0 express

我正在制作一个 Express 服务器,它将视频从 youtube 播放列表转换为 xml 播客提要。我的 app.get 返回一些生成的 xml:

app.get("/", function(req, res) {
    res.set('Content-Type', 'text/xml');
    return res.send(xml(myXmlContent, { declaration: true }));
})
Run Code Online (Sandbox Code Playgroud)

我需要用一些数据填充 myXmlContent,包括 youtube 播放列表中的视频 ID。我可以使用 youtube API 来获取这些视频 ID,但它不是同步的。它在回调中返回 ID。

在从 app.get 返回之前,我怎样才能等到得到结果?我可能会以错误的方式解决这个问题,因为超时可能是一个问题。关于如何实现依赖异步调用的动态 xml 生成的任何建议?

jfr*_*d00 5

在从 app.get 返回之前,我怎样才能等到得到结果?

你不会在 Javascript 中“等待”。相反,当您从其他 API 调用获得结果时,您在回调中发送响应。这就是 node.js 中异步开发的工作原理。

在从 app.get 返回之前,我怎样才能等到得到结果?

你没有。您可以app.get()在发送响应之前从正常状态返回。这并不意味着您已经完成了处理。 app.get()(以及 express 中间件)旨在您可以使用异步操作来获取响应数据。您只需返回,然后在异步操作完成并获得所需数据后的某个时间发送响应。

我可能会以错误的方式解决这个问题,因为超时可能是一个问题。

这不是错误的方法。但是,如果您的外部 API 真的很慢,那么您可能不得不担心 Express 超时或浏览器超时。快速超时,您可以配置。浏览器超时并不容易处理。如果需要很长时间才能获得浏览器超时的结果,那么您可能需要重新考虑您的工作方式,因为任何普通用户都会放弃页面请求或按钮按下,如果它需要很长时间浏览器超时。

获得数据后,有几种发送数据的选项。由于您没有显示您正在使用的外部 API 及其工作原理,因此我们不能非常具体。但一般来说,你会做这些事情:

  1. 您将res.send()来自其他 API 的异步完成回调放入内部。
  2. 您将其他操作的结果通过管道传输到响应中。
  3. 您使用 promise 来获取其他 API 的完成通知并将其res.send()放入 promise 的.then()处理程序中。

举个例子:

const rp = require('request-promise');

app.get("/", function(req, res) {
    rp(someURL).then(result => {
        // do some processing of result into finalData
        res.send(finalData);
    }).catch(err => {
        console.log(err);
        res.sendStatus(501);
    });
});
Run Code Online (Sandbox Code Playgroud)