NodeJS и функция экспресс-записи в HTTP-модуле с использованием Promise - PullRequest
0 голосов
/ 06 июня 2018

Я пишу экспресс-приложение, используя

  • 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 правильно ли работает после разрешения Обещания?

1 Ответ

0 голосов
/ 12 июня 2018

Проблема в том, что net.js напрямую отвечает на эти методы после завершения writeHead.Хотя голова не написана, она пытается написать тело.Вместо этого можно перехватить метод end(), который будет ожидать все, а затем закрыть соединение.

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