我有一个快速应用程序,在这里我只是从另一个远程API返回数据。以下是文件片段。我不能使用普通的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;


一切正常。



现在,我想在名为router的函数中的getData方法之外进行远程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。

最佳答案

解决此问题的一种方法是自己创建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成为可能,并通过使getData为函数,可以在每次调用它时重新获取数据。

关于javascript - 在Express应用中返回远程API数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55597477/

10-09 17:54