Я использую 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);
});