Возврат данных удаленного API в приложении Express

У меня есть экспресс-приложение, в котором я просто возвращаю данные из другого удаленного 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 не возвращает обещание, которое я могу решить.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 таким образом, он становится доступным, а сделав getData функцией, данные извлекаются заново всякий раз, когда вы ее вызываете.

Более короткое решение таково: pastebin.com/exkdiDd6 (которое, я думаю, хотел предложить Джо)

Chris G 09.04.2019 18:52

Отлично, это то, чего мне не хватало. Я пробовал .then() на getData, но, поскольку он не возвращал обещание, он ничего не делал.

Hyperbola 09.04.2019 18:54

Другие вопросы по теме