【问题标题】:Returning remote API data within Express app在 Express 应用程序中返回远程 API 数据
【发布时间】:2019-04-10 00:48:45
【问题描述】:

我有一个快速应用程序,我只是从另一个远程 API 返回数据。下面是文件sn-p。我不能使用普通的node-fetchrequest,因为我的远程 API 使用 NTLM 身份验证。

const express = require('express');
const router = express.Router();
const httpntlm = require('httpntlm');

const url = 'http://myremoteapi.com/products';

router.get('/', function(req, res, next) {  
  httpntlm.get(
    {
      url,
      username: 'my_user',
      password: 'my_pass
    },
    (err, resp) => {
      if (err) return err;
      res.send(JSON.parse(resp.body));
    }
  );
});

module.exports = router;

一切正常。


现在,我想在一个名为 getData 的函数中在 router 方法之外进行远程 API 调用。

const express = require('express');
const router = express.Router();
const httpntlm = require('httpntlm');

const url = 'http://myremoteapi.com/products';

const getData = httpntlm.get(
    {
      url,
      username: 'my_user',
      password: 'my_pass
    },
    (err, resp) => {
      if (err) return err;
      return JSON.parse(resp.body);
    }
  );

router.get('/', function(req, res, next) {
  res.send(getData) // returns undefined
});

module.exports = router;

我无法得到相同的结果。另外,我发现httpntlm 方法没有返回我可以解决的 Promise。

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    解决这个问题的一种方法是自己创建 Promise:

    const express = require('express');
    const router = express.Router();
    const httpntlm = require('httpntlm');
    
    const url = 'http://myremoteapi.com/products';
    
    const getData = () => new Promise((resolve, reject) => {
      httpntlm.get({
          url,
          username: 'my_user',
          password: 'my_pass'
        },
        (err, resp) => {
          if (err) reject(err);
          else resolve(JSON.parse(resp.body));
        }
      );
    });
    
    router.get('/', function(req, res, next) {
      getData().then(data => res.send(data));
    });
    
    module.exports = router;
    

    通过将httpntlm.get 包装成thenable,并通过将getData 设为函数,无论何时调用它都会重新获取数据。

    【讨论】:

    • 一个更简短的解决方案是:pastebin.com/exkdiDd6(我猜是乔的意思)
    • 完美,这就是我所缺少的。我确实在getData 上尝试了.then(),但由于它没有返回承诺,所以它什么也没做。
    猜你喜欢
    • 2020-11-22
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多