node对接ChatGpt的流式输出的配置
首先看一下效果
将数据用流的方式返回给客户端,这种技术需求在传统的管理项目中不多见,但是在媒体或者有实时消息等功能上就会用到,这个知识点对于前端还是很重要的。
即时你不写服务端,但是服务端如果给你这样的接口,你也得知道怎么去使用联调。
1. nodejs实现简单的SSE服务,使用write返回流式
SSE服务(Server-Sent Events),是一种服务器向客户端推送实时更新的机制模式。
const express = require('express');
const app = express();
const port = 8002;
let strArr = [
'你好',
'吃饭了吗',
'What are you doing?',
'My name is yy',
'8888',
'hello'
]
let setTask = null
app.get('/events', (req, res) => {
res.setHeader('Content-Type', 'text/event-stream;charset=utf-8');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
let num = 0
setTask = setInterval(()=>{
res.write(`data:${
strArr[num]}\n\n`)
num++
if(num > 5){
res.write(`data:end\n\n`)
res.end()
// res.closed()
clearInterval(setTask)
setTask = null
}
},1000)
});
app.listen(port, () => {
console.log(`${
port}端口已启动`);
});
2. 前端实现接收数据流
这里使用一个叫做EventSource的api去实现流式接口的调用和数据获取**。**
配置代理(重要)
如果我们用vue,react等等框架开发时,需要在代理处做一些配置,确保数据会以流式的返回。如果不做这层代理的配置,那么你获取的数据就会是执行完所有的res.write,一次性的全部返回给前端,就不是我们想要的效果。
效果如下,在配置代理中将compress设置为false
devServer:{
client:{
overlay:false
}