В App.get я хотел бы иметь два разных ответа (каналы) - PullRequest
0 голосов
/ 06 июня 2018

Я использую expressjs и в app.get хотел бы получить список ответов с одним URL (app.get).в основном я получаю сообщение об ошибке при попытке запустить res.writeHead () во второй раз.Это ошибка:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at validateHeader (_http_outgoing.js:503:11)
at ServerResponse.setHeader (_http_outgoing.js:510:3)
at ServerResponse.writeHead (_http_server.js:225:21)
at SSEChannel.subscribe (/home/pouya/Documents/nodejs/pubsub/sse-pubsub.js:39:9)
at app.get (/home/pouya/Documents/nodejs/pubsub/server.js:57:29)
at Layer.handle [as handle_request] (/home/pouya/Documents/nodejs/pubsub/node_modules/express/lib/router/layer.js:95:5)
at next (/home/pouya/Documents/nodejs/pubsub/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/pouya/Documents/nodejs/pubsub/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/pouya/Documents/nodejs/pubsub/node_modules/express/lib/router/layer.js:95:5)
at /home/pouya/Documents/nodejs/pubsub/node_modules/express/lib/router/index.js:281:22

Любая идея, как я могу решить эту проблему?

Итак, это моя часть брокера, который обрабатывает канал SSE:

app.get('/bob/sub/*', (req, res, next) => {

const channel = req.params['0'];
if(channel.includes(multilevel_indicator) || channel.includes(singlelevel_indicator))
{
    for (let [sseChannel, value] of Object.entries(sseChannels)) {
        if(wildcard(sseChannel, channel))
        {
            console.log("wildcard sub", sseChannel);
            sseChannels[sseChannel].subscribe(req, res);
        }
    }
}}

Это часть моей функции подписки

   subscribe(req, res) {
    const c = {req, res};
    c.req.socket.setNoDelay(true);
    c.res.writeHead(200, {
        "Content-Type": "text/event-stream",
        "Cache-Control": "s-maxage="+(Math.floor(this.options.maxStreamDuration/1000)-1)+"; max-age=0; stale-while-revalidate=0; stale-if-error=0",
        "Connection": "keep-alive"
    });
    return c;
}

, а это моя часть клиента sse:

const es = new EventSource("/bob/sub/#");
    console.log(channelName);
    es.addEventListener('myEvent', ev => {
        const data = JSON.parse(ev.data);
    });
...