带有 Express 异步 API 调用的 Node.JS

Posted

技术标签:

【中文标题】带有 Express 异步 API 调用的 Node.JS【英文标题】:Node.JS with Express async API call 【发布时间】:2017-03-10 15:06:47 【问题描述】:

我正在使用带有 Express 的 Node.JS(以及用于视图的 ejs),我想调用两个 API 端点以在同一页面中呈现它们并使用数据。我试过用异步来做,但我得到了

ECONNRESET: Request could not be proxied!

这是我的代码

 app.get('/profile', function(req, res) 
    async.parallel([
    function(next) 
       var query = req.query.search;
       var url = '1st url' + query;
       var request = require('request');
        request(url, function(error, body) 
           var data = JSON.parse(body);
            next(error, data);
        );
    ,
    function(next) 
        request('2nd url', function(error, tlist) 
            var list  = JSON.parse(tlist);
            next(error, list);
        );
    ], function(err, results) 
      if (!err && results.statusCode == 200)

           var data = results[0];
           var list = results[1];


        res.render('profile', data: data, list: list);
    );
);

【问题讨论】:

你坐在代理后面吗? ECONNRESET 表示连接已从另一端关闭。你应该检查你的HTTP_PROXY/HTTPS_PROXY 环境变量。 嗨,不。事实上,我正在使用 Cloud9 的在线 IDE。当我解析数据然后尝试破坏回调结果数组并将其分配给我的变量时,就会出现问题。我想在网页中独立使用这两个 JSON 文件。 首先找出两个请求中的哪一个导致错误(我的钱在第一个)。尝试从您的本地机器上运行它。否则把网址贴出来,我们可以查一下。 如何包含request 模块还有另一个问题。将require('request') 行移至文件顶部。 【参考方案1】:

不确定 Cloud9,但如果问题在于解析数据,这里有几件事。

您应该在尝试解析之前处理每个请求的错误;如果 parse 抛出异常,你的回调将不会被执行:

    request(url, function(error, body) 
      if (error) return next(error);

      var data = JSON.parse(body);

      next(null, data);
    );

您可能还应该在解析过程中使用 try/catch,并在出现异常时执行回调并报错:

    request(url, function(error, body) 
      if (error) return next(error);

      var data;

      try 
        data = JSON.parse(body);
       catch (e) 
        return next(new Error('Unable to parse body for ' + url));
      

      next(null, data);
    );

最后,您当前对 results.statusCode 的检查将始终返回 false,因为它是一个数组,因此您不会到达请求的末尾。我猜这可能是问题所在。我还建议将来自 async 的任何错误传递给 Express 错误处理程序:

function(err, results) 
  if (err) 
    // pass to Express error handler...
  

  var data = results[0];
  var list = results[1];

  res.render('profile', data: data, list: list);
);

【讨论】:

正如 svens 所指出的,您需要将 require('request') 放在顶部 嘿,谢谢你的指点。我完成了上述所有操作并尝试再次运行服务器,我收到以下错误Error: Unable to parse body for <url> at Request._callback API 端点自己工作正常,只是当我尝试同时调用它们时才会发生这种情况。我需要在我的网络应用程序中使用这两个 JSON 文件,但要独立使用,因此我认为将它们都放在一个对象中会适得其反。 这意味着正文不可解析。如果我没记错的话,我认为request 将其主体作为第三个参数传递,因此您的回调可能应该类似于request(url, (err, httpResponse, body) => )。可能值得尝试在解析正文之前注销它以查看它的样子。

以上是关于带有 Express 异步 API 调用的 Node.JS的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS Express API 调用结构异步事件

使用nodejs和rest api调用和express进行异步处理-序列错误

Express RESTful API 中的 Discord.js

Node.js 中对 API 的异步调用模式

使用 fetch 在节点中进行异步 api 调用的最佳实践?

NextJS 应用程序和 express 服务器之间的内部 API 调用和通信