back
Server-Sent Events (SSE) の例、Express.js
id: 171, 2024-10-11
概要:
Server-Sent Events で、Express.js通信する例になります。
- 一方方向の通信で、サーバーからクライアント送信らしい。
- 一定時間、配信しないと。通信が停止されるみたいです。
- メッセージ配信機能で、使用できるか試した内容です。
[ 公開日: 2024/10/10 ]
構成
- Express.js
- esbuild
- typescript
作成したコード
https://gist.github.com/kuc-arc-f/9a16fb502181d49c14a4ee28b614b9e4
dev-start
bun run build
bun run dev
- index.ts
....
app.get("/", (req, res) => {
res.sendFile(__dirname + "/index.html");
});
// SSEのエンドポイント
app.get("/events", (req, res) => {
res.setHeader("Content-Type", "text/event-stream");
res.setHeader("Cache-Control", "no-cache");
res.setHeader("Connection", "keep-alive");
// クライアントに最初のメッセージを送信
res.write("data: Connected\n\n");
// 1秒ごとにサーバーからメッセージを送信
const intervalId = setInterval(() => {
const message = `data: ${new Date().toLocaleTimeString()}\n\n`;
res.write(message);
}, 1000);
// 1000
// クライアントが接続を閉じた場合、インターバルをクリア
req.on("close", () => {
clearInterval(intervalId);
res.end();
});
});
- index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SSE Example</title>
</head>
<body>
<h1>Server-Sent Events (SSE)</h1>
<div id="messages"></div>
<script>
const eventSource = new EventSource("/events");
eventSource.onmessage = function(event) {
const messagesDiv = document.getElementById("messages");
const newMessage = document.createElement("div");
newMessage.textContent = event.data;
messagesDiv.appendChild(newMessage);
console.log(event.data);
};
eventSource.onerror = function() {
console.log("An error occurred with the SSE connection.");
};
</script>
</body>
</html>
- package.json
{
"name": "bun_33",
"private": true,
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "nodemon",
"build": "bun run build:server && bun run build:client",
"build:test": "",
"build:prod": "NODE_ENV=production bun run build",
"build:server": "bun build --target=node --minify src/index.ts --outfile dist/index.js",
"build:client": "bunx esbuild --bundle --format=esm --minify ./src/entry-client.tsx --outdir=public/static --tsconfig=tsconfig.json",
"clean": "rimraf dist",
"start": "bun run dist/index.js"
},
"dependencies": {
"axios": "^1.7.5",
"cookie-parser": "^1.4.6",
"express": "^4.19.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.26.1"
},
"devDependencies": {
"@types/node": "^22.5.4",
"@types/react": "^18.3.5",
"@types/react-dom": "^18.3.0",
"esbuild": "^0.24.0",
"nodemon": "^3.1.4",
"rimraf": "^6.0.1",
"typescript": "^5.5.2"
}
}