我最近完成了一个应用程序,通过让每个用户的客户端发出事件来模拟罗伯特规则。我通过 javascript EventSource 完成了此操作,该事件源在本地托管时完美运行。然而,当尝试在网络上托管它时,我遇到了一百万个问题。
这是代码的快照:
onMount(() => {
const source = new EventSource(`/rooms/${roomId}/activity`, {
withCredentials: false
});
const event = SSEvents[roomId as keyof typeof SSEvents];
source.addEventListener(event, (e) => {
const message = JSON.parse(e.data);
const membername: string = message.name;
delete message.name;
if (message.type === 'set') {
messageStore.update(($messageStore) => $messageStore.set(membername, message));
if (membername === $user?.toString()) {
selectedValue = message.status;
}
}
if (message.type === 'delete') {
messageStore.update(($messageStore) => {
$messageStore.delete(membername);
return $messageStore;
});
}
});
return () => {
source.close();
};
});
如何在网络上托管 SSE 应用程序?
无法在 vercel、netlify 或 cloudflare 上使用 sse,因为这些提供商是无服务器的。服务器将不会保持开启状态,任何请求都会在 10 秒后超时。当响应具有流内容类型时,他们可能已经实施了保护
您必须使用节点适配器构建应用程序并将其托管在非无服务器提供商上。