Задать вопрос
DELAKEY
@DELAKEY
Кодю почучуть

Как заставить expressjs обрабатывать одинаковые запросы одновременно?

Взял код из примеров, но получил такую вот проблему, если вызвать subscribe и ещё раз subscribe то подпишется только первый, когда отправляю send, то сообщение отправляется на первый subscribe , а второй только после этого подписывается и принимает уже второе сообщение ну и по кругу в общем
'use strict';

const express = require('express');
const parser = require('body-parser');
const events = require('events');

const dispatcher = new events.EventEmitter();
const app = express();



app.post('/send', parser.json(), (req, res) => {
    dispatcher.emit('message', JSON.stringify(req.body));
    res.set('Content-Type', 'text/plain;charset=utf-8');
    res.end('ok');
});
app.get('/send',  (req, res) => {
    dispatcher.emit('message', "fkfkf");
    res.set('Content-Type', 'text/plain;charset=utf-8');
    res.end('ok');
});

app.get('/subscribe', (req, res) => {
    console.log("subscribe")
    res.set('Content-Type', 'text/plain;charset=utf-8');
    res.set('Cache-Control', 'no-cache, must-revalidate');

    dispatcher.once('message', message => setTimeout(()=>res.end(message),Math.random() * (1000 - 0)));
});

app.use(express.static('./client'));

app.listen(4000);
  • Вопрос задан
  • 385 просмотров
Подписаться 1 Оценить 1 комментарий
Решения вопроса 1
@rustler2000
погромист сикраш
Перед dispatcher.once поставь res.flushHeaders() - тогда и с табами работает )))

Браузер не открывает следущего соединения пока с этим не все понятно. Наверное чтоб не ддосить
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
dummyman
@dummyman
диссидент-схизматик
А дык все логично, вы сначала принимаете запрос от кллиента, а потом вешаете на емиттер событие (dispatcher.once). А, по всей видимости, хотели наоборот. Вот оно и срабатывает по четным запросам.
Но если честно я вообще не понял что вы пытаетесь этим кодом сделать.
Ответ написан
@vshvydky
ну и хрень в коде у вас.
1. ONCE событие которое выполняется 1 раз и подписка забывается.
Судя, по тому что я наблюдаю. Вы сперва включаете подписку, потом шлете два "эмита" , и урл подписки возвращает вам только 1.
2. Чему тут удивляться?
3. Подписку делать как лонгпул соединение вообще бред имхо (ну или как минимум информацию с событий надо писать не через end() а через мгновенный вывод и частями отдавать текст, но это лажа.
4. Для событий существует socket.io, он замечательно дружится с экспрессом.

аставить expressjs обрабатывать одинаковые запросы одновременно

забудьте про одновременно, асинхронно, не означает одновременно. И да, в 1 момент времени обрабатывается только 1 запрос.

UPD:
И даже если будет .on метод end(text) завершит вам праздник.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы