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

时间:2018-02-16 21:53:39

标签: 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 }));
})

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

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

1 个答案:

答案 0 :(得分:2)

  

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

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

  

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

你不是。您可以在发送回复之前从app.get()返回。这并不意味着你完全没有完成处理。 app.get()(以及表达中间件)旨在让您可以使用异步操作来获取响应的数据。您只需返回,然后稍后当异步操作完成并且您拥有所需的数据时,就会发送响应。

  

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

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

一旦获得数据,有几种选择可以发送数据。由于您没有显示您正在使用的外部API以及它的工作原理,因此我们无法提供具体的信息。但一般来说,你会做这些事情:

  1. 您将res.send()置于其他API的异步完成回调中。
  2. 您将其他操作的结果传输到响应中。
  3. 您使用promises获取其他API的完成通知,并将res.send()置于promise .then()处理程序中。
  4. 举个例子:

    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);
        });
    });