嗯,我知道我晚了5年7个月,但我仍然想分享我的意见。
Socket是一个非常好的方法,但另一种方式也可以使用SSE(服务器发送事件)通过HTTP自动通知前端,但您也可以仅使用文本消息通知前端。
对于前端:
- 首先,您必须创建eventsource对象。
let sse = new EventSource(
"URL for backend",
{ withCredentials: true }
)
这里的凭证是用于传递cookie的。
2.现在添加事件监听器以从后端获取结果。
see.onmessage = (e)=>{
let data = JSON.parse(e.data)
//now do whatever you want with the data
}
后端开发:
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const app = express();
const PORT = 5000;
let clients = [];
const event = (req, res) => {
const headers = {
'Content-Type': 'text/event-stream',
'Connection': 'keep-alive',
'Cache-Control': 'no-cache',
}
res.writeHead(200, headers)
let message = { event_name: 'ONGOING' }
const data = `data: ${JSON.stringify(facts)}\n\n`
res.write(data)
const clientId = Date.now()
const newClient: Client = {
id: clientId,
response: res,
}
clients.push(newClient)
req.on('close', () => {
console.log(`${clientId} Connection closed`)
clients = clients.filter((clients: Client) => clients.id !== clientId)
})
};
const notifyEvent = ()=>{
let newMessage = { event_name: 'FINISHED' }
const data = `data: ${JSON.stringify(newMessage)}\n\n`
clients.forEach((client) => client.response.write(data))
}
stream.on('finish', () => {
console.log('finished')
return notifyEvent()
next()
})
app.get("/event", event);
app.listen(PORT, () => {
console.log(`App listening on port ${PORT}`);
});
这就是整个内容了。
我附上了一个链接,帮助我理解SSE。
https://www.digitalocean.com/community/tutorials/nodejs-server-sent-events-build-realtime-app
socket.emit("upload finished")
,客户端:socket.on("upload finished", function...)
。 - Jeremy Thille