Express - Nodejs外部休息api调用

时间:2017-08-24 07:33:08

标签: node.js express

我想对外部api进行后端调用,并使用结果填充我的页面。这样做的最佳方式是什么?

“request.get”调用是异步的,所以我理解下面的代码是错误的。但是,我已经以这种方式编写了它,以便我可以解释我想要实际做的事情。

此外,我可能有5-6个外部api,有没有办法让这个异步为每个api但同步get调用?

这是我当前代码的样子:

var express = require('express');
var request = require('request');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  var body = getRawApiResponse("someURL");
  console.log("Index >" + body);
  res.render('index', { title: 'Express', api: "some", body: body});

});


function getRawApiResponse(api){
  request.get({
    uri: api,
  },
  function(error, response, body){
    if (!error && response.statusCode === 200) {
        console.log("Index > Raw Api Response: " + body);
      } else {
        console.log(error);
      }
    });

}

3 个答案:

答案 0 :(得分:0)

查看Promises或async / await。您可以使用它们来调用异步apis并等待响应使呼叫同步。

http://bluebirdjs.com/docs/getting-started.html

您可以根据目的修改的async / await示例代码如下:

try{
                let orderDetails = await MongoHelper.findOneByCriteria(MongoCollections.ORDER,searchCriteria);
        }catch(err){
                 return err;
        }


  MongoHelper.findOneByCriteria = (collectionName, criteria) => {
    return new Promise((resolve, reject) => {
        db.collection(collectionName).find(criteria).toArray()
            .then((results) => {
                if (results.length > 0) {
                    resolve(results[0]);
                } else {
                    resolve(null);
                }
            });
    });
}

答案 1 :(得分:0)

最好的方法是使用Promises来避免回调地狱。如果你可以使用node.js v7.6或更高版本,使用async / await会更容易。

router.get('/', function(req, res, next) {
  getRawApiResponse("someURL")
    .then(body => {
      console.log("Index >" + body);
      res.render('index', { title: 'Express', api: "some", body: body});
    });
});

function getRawApiResponse(uri) {
  return new Promise((resolve, reject) => {
    request.get({ uri }, (error, response, body) => {
      if (err) {
        reject(err);
      }
      resolve(body);
    });
  });
}

在我使用 promisification getRawApiResponse返回承诺的示例中,但已经有一个模块执行相同的https://github.com/request/request-promise

答案 2 :(得分:0)

您可以将getRawApiResponse()包含在承诺

function getRawApiResponse(api){
  return new Promise(function(resolve, reject){
    request.get({
      uri: api,
    },
    function(error, response, body){
      if (!error && response.statusCode === 200) {
          resolve(body)
        } else {
          reject(error)
        }
      });
  });
}

取决于成功并在出现错误时拒绝,然后您可以将其链接到get请求中,如

router.get('/', function(req, res, next) {
  getRawApiResponse("someURL")
          .then(function(body){
              res.render('index', { title: 'Express', api: "some", body: body});
          })
          .catch(err){
              // do something
          }

});