Мы используем архитектуру микросервисов для нашего проекта. Наш проект похож на блог. Существует служба виды деятельности, которая регистрирует все действия пользователя, такие как добавление публикации, комментария, ответ на комментарий и так далее.
Теперь для каждого действия нам нужно отправить уведомление SSE вовлеченным пользователям. Для этого мы используем другой сервис под названием уведомления. Таким образом, всякий раз, когда происходит действие, HTTP-запрос будет отправлен в службу уведомлений, которая обрабатывает отправку различных событий SSE.
Однако мы сталкиваемся с некоторыми проблемами при отправке SSE. Две основные проблемы, с которыми мы сталкиваемся, это утечка памяти и ошибка Ошибка: писать после конца.
Маршрут
router
.route("/")
.get(controller.eventStream)
.post(controller.sendNotification);
Контроллер
import axios from "axios";
import eventEmitter from '../services';
const controller = {
eventStream: (req, res, next) => {
console.info("Inside event stream");
res.writeHead(200, {
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
"Connection": "keep-alive"
});
eventEmitter.on("sse", (event, data) => {
console.info('Event Triggered');
res.write(`event: ${event}\ndata: ${JSON.stringify(data)} \n\n`);
});
req.on("close", () => {
console.info("Inside Close");
res.end();
});
},
sendNotification: (req, res, next) => {
try {
const {
userId,
action,
type,
item_id,
} = req.body;
// First check the type of activity that has been performed
switch (type) {
case "topic":
// Then check the type of action that has been done
switch (action) {
case "edit":
console.info("Topic edited");
const data= 'John Doe has edited a topic';
eventEmitter.emit("sse", `edit-topic`, data);
break;
}
break;
}
res.send('sse successfully send');
} catch (error) {
res.status(500).json({error: 'SSE failed'});
}
}
};
export default controller;
Услуга
export default new events.EventEmitter();
Первоначально клиентская сторона отправит запрос ПОЛУЧИТЬ, который выполняет контроллер eventStream.
Теперь для каждого действия через этот поток необходимо отправить SSE.
Я считаю, что Ошибка: писать после конца связано с тем, что событие запускается после отправки ответа. Это можно исправить, удалив res.send('sse successfully send'); Однако узел выдаст ошибку тайм-аута.
Я не знаю, как отправить SSE с контроллера sendNotification. Более того, я не уверен, что это правильный подход. Любое руководство будет высоко оценено.
@galkin '../services' содержит только одну строку кода export default new events.EventEmitter();





Не могли бы вы добавить код
import eventEmitter from '../services';?