Files
vue-ts-example-2025/server/index.ts
严浩 4e31d8b80c
Some checks failed
/ playwright (push) Successful in 1m55s
/ build-and-test (push) Failing after 1m43s
CI/CD Pipeline / playwright (push) Successful in 3m48s
CI/CD Pipeline / build-and-deploy (push) Successful in 4m46s
refactor(server): 修改 WebSocket 关闭事件处理逻辑
2025-10-16 15:06:39 +08:00

90 lines
2.9 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export default {
async fetch(request, env) {
const url = new URL(request.url);
// 本地开发环境延迟处理
if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') {
await new Promise((r) => setTimeout(r, 250));
}
// API 路由处理
if (url.pathname.startsWith('/api/')) {
await env.KV.put(
'events:api:last-call',
`${new Date().toISOString()} ${request.method} ${url.pathname}`,
);
// 获取所有可用的键名
const availableKeys = [
'events:api:last-call',
'events:ws:connection',
'events:ws:message',
'events:ws:disconnection',
];
return Response.json({
timestamp: Date.now(),
lastApiCall: await env.KV.get('events:api:last-call'),
availableKeys: availableKeys,
storedData: {
apiLastCall: await env.KV.get('events:api:last-call'),
wsConnection: await env.KV.get('events:ws:connection'),
wsMessage: await env.KV.get('events:ws:message'),
wsDisconnection: await env.KV.get('events:ws:disconnection'),
},
});
}
// WebSocket 连接处理
if (url.pathname === '/ws') {
const upgradeHeader = request.headers.get('Upgrade');
if (upgradeHeader !== 'websocket') {
return new Response('Expected websocket', { status: 400 });
}
const [client, server] = Object.values(new WebSocketPair());
// 处理服务器端WebSocket消息
server.accept();
env.KV.put('events:ws:connection', `${new Date().toISOString()} ${url.pathname}`);
// accept 后立即发送欢迎消息
if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') {
await new Promise((r) => setTimeout(r, 250));
}
server.send(
`欢迎连接到WebSocket服务器连接时间: ${new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })}`,
);
server.addEventListener('message', async (event) => {
console.log('收到客户端消息:', event.data);
await env.KV.put('events:ws:message', `${new Date().toISOString()} ${event.data}`);
// 回复消息给客户端
if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') {
await new Promise((r) => setTimeout(r, 250));
}
server.send(
`服务器收到: ${event.data} (时间: ${new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })})`,
);
});
server.addEventListener('close', (event) => {
console.log('WebSocket连接关闭');
console.log('[close] event :>> ', event);
env.KV.put('events:ws:disconnection', `${new Date().toISOString()} ${url.pathname}`);
server.close(event.code, `连接关闭: ${event.reason}`);
});
return new Response(null, {
status: 101,
webSocket: client,
});
}
return new Response(null, { status: 404 });
},
} satisfies ExportedHandler<Env>;