V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rizon
V2EX  ›  程序员

nextjs 致命未解问题! sse 连接断开事件无法获取

  •  
  •   rizon ·
    othorizon · 12 小时 44 分钟前 via Android · 749 次点击
    在 nodejs 模式下没问题。 但是在 vercel 或者 firebase 里运行时。 客户端发起的 sse 连接,当客户端断开连接时,服务端拿不到中断事件,服务端会运行到函数正常结束。

    这在 ai chat 类产品里很致命,用户停止事件拿不到导致服务端持续运行请求造成额外的 token 消耗。

    大佬们有没有解决办法呢
    11 条回复    2025-05-15 18:44:02 +08:00
    beyondstars
        1
    beyondstars  
       12 小时 6 分钟前
    先排除 vercel 或者 firebase 的因素,会不会是 client 断开了到 vercel 的连接,但是 vercel 没有断开到你部署的 app 的连接?

    找一个 vps 或者虚拟机进行部署。

    然后你的 nextjs 的 route-handler 部分具体是怎么写的,有没有参照官方的写法 aHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2J1aWxkaW5nLXlvdXItYXBwbGljYXRpb24vcm91
    dGluZy9yb3V0ZS1oYW5kbGVycyNzdHJlYW1pbmcK (参考其中 streaming 和 ai-sdk 的部分)
    rizon
        2
    rizon  
    OP
       11 小时 46 分钟前
    @beyondstars 不用 serveless 是没有问题的,这个事情 vercel 的社区里也有讨论,都没有答案
    dssxzuxc
        3
    dssxzuxc  
       11 小时 14 分钟前
    有个办法是客户端跑路前发一个中断请求,告诉服务端这个对话可以终止了,当然有时候这个断开连接是意外导致的,比如关掉浏览器、页面崩溃,没法保证中断请求一定能正常发出,只能说这样至少能挽回一部分损失。

    另外问个问题,vercel 的 AI SDK 基本是针对 Next.js 设计的,我用 Nest.js 的时候总是感觉不太好用,但是好像也没其他选择?
    wangritian
        4
    wangritian  
       11 小时 8 分钟前
    让对端每 n 秒给自己发送一个心跳包,然后无限推迟一个比 n 秒多一点的 settimeout ?
    rocmax
        5
    rocmax  
       11 小时 1 分钟前 via Android
    https://github.com/vercel/next.js/issues/50804
    这说是修完了啊
    你的情况应该是 edge runtime 导致的
    rizon
        6
    rizon  
    OP
       11 小时 0 分钟前
    @wangritian
    @dssxzuxc
    由于是 serveless 服务,所以客户端通知唯一的办法就是引入一个新的机制来让客户端通知服务端,整个架构变复杂了,实在是有点感觉性价比太低。 看来真的没办法解决了。

    而且虽然没有测但我严重怀疑 vercel 的 ai sdk 也没解决这个问题
    rocmax
        7
    rocmax  
       10 小时 58 分钟前 via Android
    昨天恰好碰到使用 server actions 处理 stream text 时无法中断的问题,ai sdk 里说 rsc 还不支持 abortSignal ,只能改成 API 了。。。
    rizon
        8
    rizon  
    OP
       10 小时 58 分钟前
    @rocmax 我不是跑在 edge runtime 下的。nodejs 的 runtime 下不行
    rizon
        9
    rizon  
    OP
       10 小时 57 分钟前
    @rocmax 我就是用的 api route 啊,没有使用 sever action 。 并不能收到 abort 事件
    rizon
        10
    rizon  
    OP
       10 小时 29 分钟前
    @rocmax 刚写了一个 edge function 做了下测试,完全没解决。根本停不下来。哎
    dssxzuxc
        11
    dssxzuxc  
       10 小时 5 分钟前
    提 issue 吧,50804 虽然说已解决,但是翻到那条 pull 的最下面评论说了有些 node 版本下依然不行。有些功能在不同 node 版本下时好时坏太正常了,或许升级/降级就解决了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   922 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 20:49 · PVG 04:49 · LAX 13:49 · JFK 16:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.