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

时间:2016-10-27 19:39:23

标签: javascript node.js api express asynchronous

我使用带有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});
    });
});

1 个答案:

答案 0 :(得分:0)

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