В некоторых глобальных промежуточных программах уровня приложений в express.js (4.16.4) и node.js (10.15.1) я хотел бы записать cookie в заголовок при самой последней возможности, прежде чем какое-либо промежуточное ПО запишет первый байттела к объекту ответа.
Например, представив событие beforeWriteBody
для объекта Response
, мы могли бы сделать что-то вроде этого:
res.on('beforeWriteResponseBody', res => {
res.cookie('key', 'value');
});
Признавая, чтоэто событие также могут прослушиваться другими получателями, и они могут писать заголовки после этой функции, тем не менее, это было бы очень полезно для меня, поскольку это могло бы помочь избежать записи этого значения cookie несколько раз, так как я заранее не знаю, где вВ конвейере значение cookie может быть обновлено до того, как будет записан фактический первый байт тела ответа.
Асинхронизация будет в порядке, например, если любой слушатель этого события попытается записать байты в тело ответа, ивсе еще другие слушатели в списке, который будет вызван позже, этот слушатель, пишущий на теле, мог быть приостановлен, а остальныеМожно было вызвать вызывающих слушателей, затем выполнение вернулось к автору тела (хотя порядок выполнения мог бы быть сложным, если он был просто принудительно установлен как порядок присоединения слушателя, я все еще думаю, что это может быть разумно).
Я хочу сохранить что-то в cookie, но с возможностью изменять его несколько раз, не записывая несколько повторяющихся заголовков Set-Cookie, но это происходит надежно, независимо от того, какой ответ был написан, даже res.redirect()
, например.
Глядя на исходный код express.js, я вижу возможную точку, в которой можно копаться, `res.send () в response.js .
После того, как он заглянулнемного, похоже, мой beforeWriteResponseBody
будет вызываться перед первым действием узла request.end
.
Я вижу, что в узле есть события, которые близки к тому, что я хочу,например, finish
, который срабатывает после вызова end
.Но мне нужно событие, которое срабатывает до вызова res.write
или res.end
(или после того, как они были вызваны, но до того, как они выполнят какую-либо работу).