HTTP2 push для экспресса - PullRequest
       47

HTTP2 push для экспресса

0 голосов
/ 05 июля 2018

Я пытаюсь настроить HTTP2 для приложения Express, которое я создал. Как я понимаю, Express не поддерживает модуль NPM http2, поэтому я использую SPDY. Вот как я собираюсь это сделать - я буду благодарен советам людей, которые реализовали нечто подобное.

1) Настройка сервера - я хочу обернуть мое существующее приложение SPDY, чтобы сохранить существующие маршруты. Опции - это просто объект с ключом и сертификатом для SSL.

const app = express();
...all existing Express stuff, followed by:

spdy
    .createServer(options, app)
    .listen(CONFIG.port, (error) => {
    if (error) {
        console.error(error);
        return process.exit(1)
    } else {
        console.log('Listening on port: ' + port + '.')
    }
});

2) На данный момент я хочу улучшить некоторые из моих существующих маршрутов условным ответом PUSH. Я хочу проверить, есть ли какие-либо обновления для клиента, выполняющего запрос к маршруту (клиент называется конечной точкой, а обновления представляют собой массив объектов JSON, называемых изменениями конечной точки), и, если это так, нажмите на клиент ,

Моя идея состоит в том, что я напишу функцию, которая принимает res в качестве одного из своих параметров, сохранит изменения конечной точки в виде файла (я не нашел способа передать не файловые данные) и затем добавлю их в нажмите поток, затем удалите файл. Это правильный подход? Я также заметил, что есть второй параметр, который принимает поток, который является объектом req / res - правильно ли я его форматирую здесь?

const checkUpdates = async (obj, res) => {
    if(res.push){
        const endpointChanges = await updateEndpoint(obj).endpointChanges;
        if (endpointChanges) {
            const changePath = `../../cache/endpoint-updates${new Date().toISOString()}.json`;
            const savedChanges = await jsonfile(changePath, endpointChanges);
            if (savedChanges) {
                let stream = res.push(changePath, {req: {'accept': '**/*'}, res: {'content-type': 'application/json'}});

                stream.on('error', function (err) {
                    console.log(err);
                });

                stream.end();
                res.end();
                fs.unlinkSync(changePath);
            }
        }
    }
};

3) Затем в моих маршрутах я хочу вызвать метод checkUpdates с соответствующими параметрами, например:

router.get('/somePath', async (req, res) => {
    await checkUpdates({someInfo}, res);
    ReS(res, {
            message: 'keepalive succeeded'
        }, 200);
    }
);

Это правильный способ реализации HTTP2?

...