Express.js - получить значение res.send - PullRequest
0 голосов
/ 16 января 2019

Мой вопрос точно этот один. Проблема в том, что когда я применяю решение к этому вопросу, ничего не происходит - значение res.send не регистрируется. Я использую экспресс 4.16.4.

Вот мой код:

/* FILE: /app.js: */

...
const postRoute = require('./middleware/postRoute');
const myRoute = require('./routes/myRoute');
...
app.use('/', myRoute);
app.use(postRoute);
...

/* FILE: /routes/myRoute */

...
router.post('/myRoute', [], (req, res, next) => {
    res.send({ status:'success', message:'Test success. Feels good, man.' });
    next();
});
...

/* FILE: /middleware/postRoute */

const postRoute = function(req, res, next) {
    console.log('postRoute: ');
    var send = res.send;
    res.send = function(chunk, encoding){
        res.send = send;
        if (chunk) {
            console.log('postRoute chunk: ', chunk); // This statement is never reached
        }
        res.send(chunk, encoding);
    };
    next();
};
module.exports = { postRoute };

Когда я делаю POST запрос к /myRoute с помощью Почтальона, он регистрирует следующее: postRoute:, и все. Второй console.log() никогда не достигается, и, по-видимому, ни одно другое утверждение в том же function(), что и console.log().

Вопрос, на который я ссылаюсь в начале моего вопроса, был с 2015 года, когда я предположил, что они использовали другую версию Express.js, и поэтому их решение не работает для меня? В моем примере кода промежуточного программного обеспечения я использовал код из вопроса, который был связан в одном из ответов на этот вопрос, потому что это решение не сработало для меня. Но это решение, очевидно, тоже не работает, иначе меня бы здесь не было - и это с 2012 года! Кто нибудь знает, какую версию Express они тогда использовали!?

Итак, чтобы повторить и завершить мой вопрос: Как использовать промежуточное ПО для записи значения, переданного res.send()?

Последующий вопрос (но дайте мне знать, если мне лучше задать этот вопрос в отдельном вопросе): Есть ли способ вызвать промежуточное ПО после маршрута / ответа от маршрута, а не глобально. Так что router.post('/myRoute', [postRoute], (req, res, next) => {...}); вместо app.use(postRoute)?

1 Ответ

0 голосов
/ 17 января 2019

Вот что я в итоге сделал. Я сохранил свою файловую структуру точно такой же, но вместо res.send() из маршрута я прикрепил объект, который я бы отправил, к объекту res и затем вызвал next() в конце моего маршрута. Так, например, res.send({message:'blah'}); становится res.return = {message:'blah'}; next();. Я использую .return, потому что я не верю, что такое свойство существует для объекта res по умолчанию, и я считаю его достаточно описательным для моих целей. Затем в моем postRoute промежуточном программном обеспечении я могу легко получить доступ к res.return, после чего я звоню return res.send(res.return).

Используя мой пример из вопроса (app.js остается именно таким, каким вы его видите):

/* FILE: /routes/myRoute */

...
router.post('/myRoute', [], (req, res, next) => {
    if(theConditionIsMet()) {
        res.return = { message:'The condition was met.' };
    } else {
        res.return = { message:'The condition was not met.' };
    }
    next();
});
....
router.post('/anotherRoute', [], (req, res, next) => {
    // In this route I don't need to intercept the response, so I just do it like normal.
    return res.send({ message:'Feels good, man.' });
});
...

/* FILE: /middleware/postRoute */

const postRoute = function(req, res, next) {
    if(res.hasOwnProperty('return') {
        return res.send(res.return);
    }
};
module.exports = { postRoute };

Один недостаток, который я уже вижу, состоит в том, что теперь мне придется реструктурировать все мои маршруты, чтобы использовать этот метод res.send() ing (или, по крайней мере, все маршруты, для которых я хочу перехватить возвращаемое значение). Из-за этого и из-за того, что я представляю, что кто-то более знающий, чем я, возможно, сможет найти лучший способ сделать это, я не собираюсь принимать свой собственный ответ.

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