如何在SSE流结束后向前端返回token并完成后端存储
解决SSE流结束后执行数据库操作并返回Token的问题
直接修改end事件回调代码,在异步流程中完成数据库存储、Token获取,并通过SSE流的最后一条消息将Token返回给前端:
const response = ResponsefromServer; const sseStream = new SseStream(req); sseStream.pipe(res); const reader = response.body; reader.on('data', (data: any) => { sseStream.write({ data }); }); reader.on('end', async () => { console.log("End of stream"); try { // 1. 执行数据库存储逻辑,替换为你的实际存储代码 const savedRecord = await yourDbModel.save({ // 填入需要存储的业务数据,比如从请求参数/流内容中提取的信息 streamContent: 'xxx', requestId: req.id }); // 2. 获取或生成目标Token,替换为你的实际Token逻辑 const tokenId = await generateToken(savedRecord.id); // 3. 将Token以SSE消息形式发送给前端 sseStream.write({ data: JSON.stringify({ token: tokenId }) }); } catch (err) { // 可选:向前端反馈错误信息 sseStream.write({ data: JSON.stringify({ error: '后续操作失败' }) }); console.error('流结束后处理出错:', err); } finally { // 确保无论成败都关闭SSE流 sseStream.end(); } });
关键注意事项
- 利用
async/await处理异步的数据库操作和Token生成,避免回调嵌套 - 用
try/catch捕获异步错误,防止流程中断导致流无法关闭 - 发送Token时需将对象转为JSON字符串,前端接收后通过
JSON.parse()解析即可 - 必须在
finally块中调用sseStream.end(),保证SSE流正常终止
内容的提问来源于stack exchange,提问作者Arsene Wenger
相关产品推荐
相关产品推荐

