【问题标题】:Express - Nodejs external rest api callExpress - Nodejs 外部 rest api 调用
【发布时间】:2017-08-24 15:40:13
【问题描述】:

我想对外部 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);
      }
    });

}

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    您可以将 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
              }
    
    });
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        最好的方法是使用 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);
            });
          });
        }
        

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

        【讨论】:

          猜你喜欢
          • 2014-10-09
          • 1970-01-01
          • 2022-01-21
          • 1970-01-01
          • 2018-03-24
          • 2022-07-06
          • 2018-05-24
          • 1970-01-01
          • 2014-02-17
          相关资源
          最近更新 更多