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

Node.JS with Express async API call

本文关键字:Node JS 调用 API Express 异步 带有      更新时间:2023-09-26

我使用Node.JS与Express(和ejs的视图),我想调用两个API端点呈现它们在同一页面和使用数据。我试过用async做,但我得到

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

不确定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});
});