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

标签 javascript node.js

我试图实现一个 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/

相关文章:

javascript - 不安全的 JavaScript 试图访问 Safari 中的框架警告

javascript - 如何将 for 循环/while 转换为漂亮的 CoffeeScript

javascript - 如何将一些 HTML 中的 Vue 组件添加到另一个 Vue 组件?

javascript - For 循环中的 setTimeout 不起作用

node.js - 如何使用绑定(bind)更新 Azure 函数中的 Azure 表行?

javascript - 为什么我的fs错误在Node.js中返回空对象?

sql - 从 Sequelize 原始 SQL 查询返回大写列名

javascript - 试图找出这段代码,javascript中的对象

php - 如何使用 index.php?-url 和 colorbox

javascript - 调用 Node 服务器中的rest服务