diff --git a/index.js b/index.js new file mode 100644 index 0000000..3b74d99 --- /dev/null +++ b/index.js @@ -0,0 +1,57 @@ +import http from 'http'; + +const server = http.createServer(async (req, res) => { + // 设置 CORS 头 + res.setHeader('Access-Control-Allow-Origin', '*'); // 允许所有域名访问 + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); // 允许的 HTTP 方法 + res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); // 允许的请求头 + + if (req.method === 'OPTIONS') { + // 对于预检请求,直接返回 + res.writeHead(204); + res.end(); + return; + } + + if (req.url === '/events') { + // 设置响应头 + res.writeHead(200, { + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-cache', + Connection: 'keep-alive', + }); + + // 发送事件 + const sendEvent = (msg) => { + return new Promise((resolve) => { + setTimeout(() => { + const data = `data: ${msg ? msg : new Date().toLocaleTimeString()}\n\n`; + res.write(data); + resolve(); + }, 1000); + }); + }; + + // 每秒发送一次消息 + await sendEvent('Start'); + for (let i = 0; i < 10; i++) { + await sendEvent(); + } + await sendEvent('End'); + res.end(); + + // 清理连接 + req.on('close', () => { + console.log('Client disconnected'); + res.end(); + }); + } else { + res.writeHead(404); + res.end(); + } +}); + +// 监听端口 +server.listen(3000, () => { + console.log('SSE server is running at http://localhost:3000/events'); +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..72b9263 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "name": "node-local-server", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "start": "node ./index.js" + }, + "keywords": [], + "author": "", + "license": "ISC" +}