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 平台的流式聊天能力。在实际应用中,开发者可以根据业务需求进一步优化错误处理和连接管理逻辑。
- QQwen3-Omni-30B-A3B-InstructQwen3-Omni是多语言全模态模型,原生支持文本、图像、音视频输入,并实时生成语音。00
- HHunyuan-MT-7B腾讯混元翻译模型主要支持33种语言间的互译,包括中国五种少数民族语言。00
GitCode-文心大模型-智源研究院AI应用开发大赛
GitCode&文心大模型&智源研究院强强联合,发起的AI应用开发大赛;总奖池8W,单人最高可得价值3W奖励。快来参加吧~0269get_jobs
💼【AI找工作助手】全平台自动投简历脚本:(boss、前程无忧、猎聘、拉勾、智联招聘)Java00AudioFly
AudioFly是一款基于LDM架构的文本转音频生成模型。它能生成采样率为44.1 kHz的高保真音频,且与文本提示高度一致,适用于音效、音乐及多事件音频合成等任务。Python00GOT-OCR-2.0-hf
阶跃星辰StepFun推出的GOT-OCR-2.0-hf是一款强大的多语言OCR开源模型,支持从普通文档到复杂场景的文字识别。它能精准处理表格、图表、数学公式、几何图形甚至乐谱等特殊内容,输出结果可通过第三方工具渲染成多种格式。模型支持1024×1024高分辨率输入,具备多页批量处理、动态分块识别和交互式区域选择等创新功能,用户可通过坐标或颜色指定识别区域。基于Apache 2.0协议开源,提供Hugging Face演示和完整代码,适用于学术研究到工业应用的广泛场景,为OCR领域带来突破性解决方案。00- HHowToCook程序员在家做饭方法指南。Programmer's guide about how to cook at home (Chinese only).Dockerfile08
- PpathwayPathway is an open framework for high-throughput and low-latency real-time data processing.Python00
热门内容推荐
最新内容推荐
项目优选









