Добавить заголовок ко всем ответам после обработки, но до отправки клиенту - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть две конечные точки в приложении js для узла:

app.get('search', myGetController);
app.post('add', myPostController);

Для простоты предположим, что обе службы имеют только следующий код:

exports.myGetController = function(req, res) {
    res.status(404).json({ error: "not found" });
};

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

// process all responses to add ed25519
app.use(function(req, res, next) {
    res.setHeader('CharCount', [How To get Body content]);
    next();
});

У меня два вопроса:

Прежде всего, я бы хотел, чтобы все мои контроллеры проходили мимо этого промежуточного программного обеспечения после обработки.

Во-вторых, я хотел бы получить доступ к содержимому тела, чтобы я мог создать заголовок на основе его содержимого.

UPDATE

Я попробовал предложенный ответ, который кто-то написал, и он не работает, или я что-то упустил.

Вот что у меня есть (до настройки маршрутов):

app.use(function(req, res, next) {
    const oldResJson = res.json;

    res.json = function(body) {
        res.setHeader('myToken', generateHeaderBasedOnBody(oldResJson));
        oldResJson.call(res, body);
    }

    next();
});

Ответ, который передается моему методу, является пустой строкой, хотя ответ, отправленный службой, не является пустым. Я делаю это не в том месте или чего мне не хватает?

1 Ответ

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

Одним из решений этой проблемы было бы переопределить функцию res.json следующим образом:

// process all responses to add ed25519
app.use(function(req, res, next) {
    const oldResJson = res.json;

    res.json = function(body) {
        res.setHeader('CharCount', /* Use body here */);
        oldResJson.call(res, body);
    }

    next();
});

При этом вам даже не нужно менять контроллеры.

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