Преобразование полезной нагрузки из requestjs перед отправкой клиенту - PullRequest
0 голосов
/ 24 ноября 2018

Братья и сестры, я создаю Express API Endpoint, который должен использовать внешний API, выполнить некоторое изменение ключей и значений и вернуться к результату клиенту.Вот что у меня есть:

const external_endpoint = <external_api_end_point>;

app.get('/', function (req, res, next) {

  request({ url: external_endpoint}).pipe(res);
});

Возвращает точную полезную нагрузку, полученную при прямом нажатии external_endpoint.

Не могу ли я что-то сделать, чтобы изменить res перед отправкой клиенту?Я попробовал несколько вещей, но ничего не сработало.Какие-нибудь идеи или лучшие практики, связанные с выполнением преобразования входящей полезной нагрузки?

Ради простоты.Допустим, это полезная нагрузка obj.json:

{
    "sad": {
        "userid": 5,
        "username": "jsmith",
        "isAdmin": true
    }
}

, и я хочу изменить sad на happy.

Я знаю, что вне запроса я мог бы сделать что-то вроде этого:

obj = JSON.parse(JSON.stringify(obj).split('"sad":').join('"happy":'));

, но бросание obj вместо res не будет работать.Я попытался присвоить значение этим res и res.body, но без кубиков.

Спасибо за помощь заранее!

1 Ответ

0 голосов
/ 24 ноября 2018

Если вы используете request-promise, вы можете просто создать новый ответ и отправить его или изменить полученный ответ:

app.get('/', function (req, res, next) {    
    request({ url: external_endpoint, json: true})
        .then(response => res.json({ happy: response.sad })))
        .catch(next);
});

(конечно, вам необходимо правильно обрабатывать ошибки))

Если вы хотите обработать его как поток (что имеет смысл, если у вас огромное количество данных), вы можете использовать оригинальный модуль request и использовать event-stream для создания канала:

const es = require('event-stream');

const swapper = es.through(
    function write(data) {
        this.emit("data", data.replace("sad", "happy"));
    },
    function end() {
        this.emit("end");
    }
);

request({ url: external_endpoint})
    .pipe(es.stringify())
    .pipe(swapper)
    .pipe(es.parse())
    .pipe(res);

Вот песочница для проверки обработки потока: https://codesandbox.io/s/3wqx67pq6

...