Я пишу экспресс-приложение, используя
- NodeJS v8
- express (последняя версия)
После просмотра onHeaders *Модуль 1010 * и, узнав, как модуль переписывает заголовок HTTP, я хотел использовать эту функцию JavaScript.
Я хотел написать небольшую сессионную систему, используя мой SQL-сервер.Я знаю о модуле session
из Express, но этот модуль не может обрабатывать конкретные таблицы и настройки, мне нужно.Для удобства я хотел, чтобы сессия была вставлена в запрос перед контроллерами и сохранена после завершения всех контроллеров.(например, был вызван метод writeHead)
Мой код в сеансе выглядит следующим образом:
core = async function(req, res, next) {
res.writeHead = hijackHead(res.writeHead); // Hijack the writeHead method to apply our header at the last
}
//[...](Omitted code)
hijackHead = function(writeFunction) {
let fired = false;
return function hackedHead(statusCode) {
if ( fired ) {
return;
}
//[...](Omitted code)
debug("Session data has changed. Writing");
sessionManager.storeSessionData(session.identifier, session).then(() => { // Promise taking ~60ms to resolve
debug("Finished writing...");
callMe(); // Current idea of calling the writeHead of the original res
});
let that = this, // Arguments to apply to the original writeHead
args = arguments
function callMe() {
debug("Finished! Give control to http, statuscode: %i", statusCode);
writeFunction.apply(that, args); // Call the original writeHead from the response
debug("Sent!")
}
} // End of hackedHead
} // End of hijackHead
Основная функция передается для выражения в качестве промежуточного программного обеспечения.Дополнительно sessionManager.storeSessionData
- это Обещание, хранящее данные и выполняющее после этого, занимающее ~ 60 мс.Обещание прошло испытания и работает отлично.Когда я сейчас делаю запрос с использованием этого контроллера, модуль Node net
возвращает ошибку:
TypeError: Invalid data, chunk must be a string or buffer, not object
at Socket.write (net.js:704:11)
at ServerResponse._flushOutput (_http_outgoing.js:842:18)
at ServerResponse._writeRaw (_http_outgoing.js:258:12)
at ServerResponse._send (_http_outgoing.js:237:15)
at write_ (_http_outgoing.js:667:15)
at ServerResponse.end (_http_outgoing.js:751:5)
at Array.write (/usr/lib/node_modules/express/node_modules/finalhandler/index.js:297:9)
at listener (/usr/lib/node_modules/express/node_modules/on-finished/index.js:169:15)
at onFinish (/usr/lib/node_modules/express/node_modules/on-finished/index.js:100:5)
at callback (/usr/lib/node_modules/express/node_modules/ee-first/index.js:55:10)
Поскольку новой функции требуется около 30 мс для реакции и возврата Promise, функция завершается раньше, вызывая Node дляавария.Я уже пытался заблокировать цикл Node с помощью time, timeout или даже рекурсивной функции.Ни один из них не работал.
Я пытаюсь максимально упростить код, и я надеюсь, что я не слишком упростил его.
Теперь я спрашиваю, может ли кто-нибудь помочь мне, как позвонить writeHead
правильно ли работает после разрешения Обещания?