Перенаправлять асинхронные вызовы, сделанные модулем npm «запрос», внутри приложения nodejs express - PullRequest
0 голосов
/ 12 сентября 2018

Я хотел бы перехватить асинхронный вызов, сделанный по запросу.
Вызов, который я хочу перехватить, это "https://api.ap.org/v2/yada/yada".

Я хочу перехватить этот сторонний вызов api.ap.org и перенаправить его на другой сервис, скажем, 127.0.0.1:3001.

Я также хотел бы добавить заголовки во время этого процесса перехвата.

Я знаю, как перехватывать все вызовы, сделанные по экспресс-маршруту js через http-proxy, но это не перехватывает вызовы, сделанные внутри самого nodejs.

 router.get('/', function(req, res, next) {
   request("https://api.ap.org/v2/yada/yada", {}, (err, data) => {
       console.log('---- call made')
       console.log(data);
    });
   res.render('index', { title: 'Express' });
 });

ОБНОВЛЕНИЕ - от Estus

function patchedRequest(url, options, ...args) {
  let newUrl = 'https://www.google.com/' // replace url with another one;
  console.log('------ args');
  console.log(url);
  console.log(options);
  if(url.match(/api\.ap\.org/).length){
      options = {};
      newUrl = 'http://127.0.0.1:3000/api'
  }
  return originalRequest(newUrl, options, ...args);
}
  • Это позволяет мне перехватывать вызов стороннему API и отправлять ему услугу по моему выбору.

Спасибо, Эстус!

1 Ответ

0 голосов
/ 12 сентября 2018

Это можно сделать, посмеиваясь над оригинальным модулем request.

Примерно так работают библиотеки, вроде proxyquire, работающие с кэшем:

patch-request.js

const originalRequest = require('request');

function patchedRequest(url, ...args) {
  const newUrl = 'https://www.google.com/' // replace url with another one;
  return originalRequest(newUrl, ...args);
}

Object.assign(patchedRequest, originalRequest);

for (const verb of 'get,head,options,post,put,patch,del,delete'.split(',')) {
  patchedRequest[verb] = function (url, ...args) {
    const newUrl = 'https://www.google.com/' // replace url with another one;
    return originalRequest[verb](newUrl, ...args);
  };
}

module.exports = require.cache[require.resolve('request')].exports = patchedRequest;

index.js

// patch request before it's required anywhere else
require('./patch-request');

// load the app that uses request
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...