У меня есть экспресс-приложение, в котором я просто возвращаю данные из другого удаленного API. Ниже приведен фрагмент файла. Я не могу использовать обычные node-fetch
или request
, так как мой удаленный 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;
Все работает нормально.
Теперь я хотел бы использовать удаленный вызов API вне метода router
в функции с именем getData
.
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 самостоятельно:
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
функцией, данные извлекаются заново всякий раз, когда вы ее вызываете.
Отлично, это то, чего мне не хватало. Я пробовал .then()
на getData
, но, поскольку он не возвращал обещание, он ничего не делал.
Более короткое решение таково: pastebin.com/exkdiDd6 (которое, я думаю, хотел предложить Джо)