gpt4 book ai didi

javascript - 保持 Node JS 连接打开并写入(GET 请求)

转载 作者:搜寻专家 更新时间:2023-11-01 00:41:00 24 4
gpt4 key购买 nike

我试图实现一个 NODE JS get 方法,我可以在其中编码 url 参数并像在服务器发送事件中一样发回响应。例如,当我使用:

curl -D- 'http://localhost:8030/update'

服务器会返回一条消息,然后保持连接打开以返回更多消息(如推送)。我正在使用 require('connect'),我尝试使用 require('express') 但无法正常工作。

这是我的部分代码:

var http        = require('http');
var connect = require('express');
var app = connect();

app.use(bodyParser.urlencoded({ extended: false }))
.use(bodyParser.json()) // JSON
.use(cors(corsOpts))
.get('/update', updateMiddleware);

var server = http.createServer(app);

server.listen("twserver.alunos.dcc.fc.up.pt", 8030);

function updateMiddleware(req, res) {
res.setHeader('Connection', 'keep-alive');
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.writeHead(200);
setTimeout(function() {
res.write("this is an event");
res.flushHeaders();
}, 1000);
setTimeout(function() {
res.write("this is another event");
}, 2000);
// should print without ending
}

编辑:我发现它可以工作,但仅限于 chrome。在terminal等了好久才收到,消息成 block 的来。

最佳答案

您不能使用单个 HTTP 请求来监听多个事件数据。如果你真的坚持使用 HTTP(即 WebSocket 或 WebRTC 不是一个选项)那么你正在寻找的技术称为 long polling .这基本上是这样工作的:

  • 客户端向服务器发送请求
  • 服务器等待直到事件发生(或直到特定但不太长的超时,因此客户端应用程序不会为请求抛出超时错误)
  • 服务器响应完整 http 响应,包含事件的详细信息
  • 客户端收到事件详细信息并立即发送另一个请求以收听更多事件。

这个方法真正利用了HTTP Keep-Alive

编辑:

对我来说,您的代码似乎不遵循服务器发送事件的协议(protocol)。这是一个教程:Server-Sent Events in nodejs .

正在关注 another tutorial on MDN about Server-Sent Events ,消息的结构应如下所示:

: this is a test stream

data: some text

data: another message
data: with two lines

请注意,要发送的数据后面必须跟一个双换行符\n\n

关于javascript - 保持 Node JS 连接打开并写入(GET 请求),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34521500/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com