Egg.js 中使用 egg-http-proxy 实现 Dify API 的 SSE 流式输出
在基于 Egg.js 框架开发应用时,我们经常需要代理第三方 API 接口。本文将详细介绍如何使用 egg-http-proxy 中间件来代理 Dify 平台的聊天消息接口,并实现 Server-Sent Events (SSE) 的流式输出功能。
技术背景
SSE (Server-Sent Events) 是一种服务器推送技术,允许服务器单向向客户端发送事件流。与 WebSocket 不同,SSE 是单向通信,适用于服务器向客户端推送数据的场景。Dify 平台的 /chat-messages 接口在 response_mode=streaming 参数下会返回 SSE 格式的聊天消息流。
服务端实现
在 Egg.js 项目中,我们需要创建一个控制器来处理 Dify API 的代理请求:
const Controller = require('egg').Controller;
class DifyController extends Controller {
async all() {
const { ctx, config } = this;
await ctx.proxyRequest(config.dify.host, {
streaming: true, // 启用流式传输
headers: {
Authorization: 'Bearer ' + config.dify.apiKey,
},
rewrite(urlObj) {
// 重写路径,移除/dify前缀
urlObj.pathname = urlObj.pathname.replace(/^\/dify/, '');
return urlObj;
}
});
}
}
module.exports = DifyController;
关键配置说明:
streaming: true启用流式传输模式headers中添加 Dify API 所需的认证头rewrite函数用于重写请求路径
客户端实现
客户端需要使用 EventSource 或兼容的库来接收 SSE 事件流。这里我们使用 @microsoft/fetch-event-source 库:
import { fetchEventSource } from '@microsoft/fetch-event-source'
const ctrl = new AbortController();
let loading = 'Loading...';
let answer = '';
fetchEventSource('/chat-messages', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer {API_KEY}'
},
body: JSON.stringify({
user: 'fym',
query: 'Hello',
response_mode: 'streaming',
inputs: {}
}),
signal: ctrl.signal,
onopen: (e) => {
console.log('SSE连接已建立', e);
},
onclose: (e) => {
console.log('SSE连接已关闭', e);
loading = 'closed';
},
onerror: (e) => {
console.error('SSE错误', e);
loading = e.message;
ctrl.abort();
},
onmessage: (e) => {
try {
const data = JSON.parse(e.data);
loading = data.event;
switch (data.event) {
case 'message':
answer += data.answer;
break;
case 'end':
loading = '';
break;
case 'error':
loading = data.error;
ctrl.abort();
break;
default:
break;
}
} catch (error) {
// 忽略JSON解析错误,继续处理后续事件
console.warn('SSE数据解析异常', error);
}
}
});
注意事项
-
文件上传处理:如果需要使用 Dify 的文件上传接口,必须配置
egg-multipart的 mode 为 stream,否则会返回 400 错误。 -
错误处理:SSE 流可能会包含非 JSON 格式的数据,客户端需要妥善处理解析异常。
-
连接管理:使用 AbortController 可以灵活控制 SSE 连接的开启和关闭。
-
性能考虑:长时间保持的 SSE 连接会占用服务器资源,需要合理设计连接超时和重连机制。
总结
通过 Egg.js 的 egg-http-proxy 中间件,我们可以轻松实现 Dify API 的代理和 SSE 流式输出功能。这种方案既保持了 Egg.js 应用的架构完整性,又能充分利用 Dify 平台的流式聊天能力。在实际应用中,开发者可以根据业务需求进一步优化错误处理和连接管理逻辑。
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
MiniMax-M2.5MiniMax-M2.5开源模型,经数十万复杂环境强化训练,在代码生成、工具调用、办公自动化等经济价值任务中表现卓越。SWE-Bench Verified得分80.2%,Multi-SWE-Bench达51.3%,BrowseComp获76.3%。推理速度比M2.1快37%,与Claude Opus 4.6相当,每小时仅需0.3-1美元,成本仅为同类模型1/10-1/20,为智能应用开发提供高效经济选择。【此简介由AI生成】Python00
ruoyi-plus-soybeanRuoYi-Plus-Soybean 是一个现代化的企业级多租户管理系统,它结合了 RuoYi-Vue-Plus 的强大后端功能和 Soybean Admin 的现代化前端特性,为开发者提供了完整的企业管理解决方案。Vue06- RRing-2.5-1TRing-2.5-1T:全球首个基于混合线性注意力架构的开源万亿参数思考模型。Python00
Qwen3.5Qwen3.5 昇腾 vLLM 部署教程。Qwen3.5 是 Qwen 系列最新的旗舰多模态模型,采用 MoE(混合专家)架构,在保持强大模型能力的同时显著降低了推理成本。00