- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个非常简单的 Node 服务,公开了一个旨在使用服务器发送事件(SSE)连接的端点,以及一个非常基本的 ReactJs 客户端,通过 EventSource.onmessage 使用它。
首先,当我在 updateAmountState (Chrome Dev) 中设置调试点时,我看不到它被唤起。
其次,我收到 net::ERR_INCOMPLETE_CHUNKED_ENCODING 200(正常)。根据https://github.com/aspnet/KestrelHttpServer/issues/1858 “chrome 中的 ERR_INCOMPLETE_CHUNKED_ENCODING 通常意味着在写入响应正文的过程中应用程序抛出了未捕获的异常”。然后我检查了服务器端是否发现任何错误。好吧,我在 setTimeout(() => {... 中的 server.js 中的几个地方设置了断点,并且我看到它定期运行。我希望每行只运行一次。所以看来前端是尝试永久调用后端并收到一些错误。
整个应用程序,无论是 ReactJs 中的前端还是 NodeJs 中的服务器,都可以在 https://github.com/jimisdrpc/hello-pocker-coins 中找到。 .
后端:
const http = require("http");
http
.createServer((request, response) => {
console.log("Requested url: " + request.url);
if (request.url.toLowerCase() === "/coins") {
response.writeHead(200, {
Connection: "keep-alive",
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache"
});
setTimeout(() => {
response.write('data: {"player": "Player1", "amount": "90"}');
response.write("\n\n");
}, 3000);
setTimeout(() => {
response.write('data: {"player": "Player2", "amount": "95"}');
response.write("\n\n");
}, 6000);
} else {
response.writeHead(404);
response.end();
}
})
.listen(5000, () => {
console.log("Server running at http://127.0.0.1:5000/");
});
前端:
import React, { Component } from "react";
import ReactTable from "react-table";
import "react-table/react-table.css";
import { getInitialCoinsData } from "./DataProvider";
class App extends Component {
constructor(props) {
super(props);
this.state = {
data: getInitialCoinsData()
};
this.columns = [
{
Header: "Player",
accessor: "player"
},
{
Header: "Amount",
accessor: "amount"
}
];
this.eventSource = new EventSource("coins");
}
componentDidMount() {
this.eventSource.onmessage = e =>
this.updateAmountState(JSON.parse(e.data));
}
updateAmountState(amountState) {
let newData = this.state.data.map(item => {
if (item.amount === amountState.amount) {
item.state = amountState.state;
}
return item;
});
this.setState(Object.assign({}, { data: newData }));
}
render() {
return (
<div className="App">
<ReactTable data={this.state.data} columns={this.columns} />
</div>
);
}
}
export default App;
我在 chrome 上看到的异常:
所以我的直接问题是:为什么我收到 ERR_INCOMPLETE_CHUNKED_ENCODING 200?我是否缺少后端或前端的某些内容?
一些提示可能对我有帮助:
为什么我看到 websocket 处于 oending 状态,因为我根本没有使用 websocket?我知道基本的区别(websocket 是双向的,从前到后和从后到前,是一个不同的协议(protocol),而 SSE 通过 http 运行,只是从后到前)。但使用websocket根本不是我的本意。 (参见下面打印屏幕中的蓝线)
为什么我看到 0 字节和 236 字节的事件源都失败了。我知道 eventsource 正是我在编写“this.eventSource = new EventSource("coins");”时尝试使用的内容。 (请参阅下面打印屏幕中的读取行)
至少对我来说非常奇怪,有时当我终止服务时我可以看到 updateAmountState 方法被调用。
如果在浏览器中调用 localhost:5000/coins,我可以看到服务器应答响应(都是 json 字符串)。我可以假设我对服务器进行了正确编码,并且错误仅出现在前端吗?
最佳答案
以下是您问题的答案。
websocket
与您在此处发布的代码无关。它可能与您在应用程序中使用的另一个 NPM 包有关。您也许可以通过查看网络请求中的 header 来找出它来自哪里。eventsource
请求失败的最可能原因是它们超时。 Chrome 浏览器将在两分钟不活动后终止不活动的流。如果你想让它保持事件状态,你需要添加一些代码,以至少每两分钟一次从服务器向浏览器发送一些内容。为了安全起见,最好每分钟发送一些内容。下面是您需要的示例。如果您在服务器代码中的第二个 setTimeout
之后添加它,它应该可以满足您的需要。const intervalId = setInterval(() => {
res.write(`data: keep connection alive\n\n`);
res.flush();
}, 60 * 1000);
req.on('close', () => {
// Make sure to clean up after yourself when the connection is closed
clearInterval(intervalId);
});
updateAmountState
方法被调用。如果您没有一致地看到它,这可能不是一个主要问题,但它可能有助于清理 setTimeout
,以防服务器在完成之前停止。您可以通过将它们声明为变量,然后将变量名称传递给关闭事件处理程序中的 clearTimeout
来实现此目的,类似于我在上面 #2 的示例中对间隔所做的操作。关于node.js - 在 ReactJs 中使用 EventSource 消费事件流时获取 net::ERR_INCOMPLETE_CHUNKED_ENCODING 200,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56450228/
这个问题在这里已经有了答案: Why filter() after flatMap() is "not completely" lazy in Java streams? (8 个答案) 关闭 6
我正在创建一个应用程序来从 Instagram 收集数据。我正在寻找像 Twitter 流 API 这样的流 API,这样我就可以自动实时收集数据而无需发送请求。 Instagram 有类似的 API
我正在使用 Apache Commons 在 Google App Engine 中上传一个 .docx 文件,如此链接中所述 File upload servlet .上传时,我还想使用 Apach
我尝试使用 DynamoDB 流和 AWS 提供的 Java DynamoDB 流 Kinesis 适配器捕获 DynamoDB 表更改。我正在 Scala 应用程序中使用 AWS Java 开发工具
我目前有一个采用 H.264 编码的 IP 摄像机流式视频 (RTSP)。 我想使用 FFmpeg 将此 H.264 编码流转换为另一个 RTSP 流,但 MPEG-2 编码。我该怎么做?我应该使用哪
Redis 流是否受益于集群模式?假设您有 10 个流,它们是分布在整个集群中还是都分布在同一节点上?我计划使用 Redis 流来实现真正的高吞吐量(200 万条消息/秒),所以我担心这种规模的 Re
这件事困扰了我一段时间。 所以我有一个 Product 类,它有一个 Image 列表(该列表可能为空)。 我想做 product.getImages().stream().filter(...) 但
是否可以使用 具有持久存储的 Redis 流 还是流仅限于内存数据? 我知道可以将 Redis 与核心数据结构的持久存储一起使用,但我已经能够理解是否也可以使用 Redis 中的流的持久存储。 最佳答
我开始学习 Elixir 并遇到了一个我无法轻松解决的挑战。 我正在尝试创建一个函数,该函数接受一个 Enumerable.t 并返回另一个 Enumerable.t ,其中包含下 n 个项目。它与
我试图从 readLine 调用创建一个无限的字符串流: import java.io.{BufferedReader, InputStreamReader} val in = new Buffere
你能帮我使用 Java 8 流 API 编写以下代码吗? SuperUser superUser = db.getSuperUser; for (final Client client : super
我正在尝试服用补品routeguide tutorial,并将客户端变成rocket服务器。我只是接受响应并将gRPC转换为字符串。 service RouteGuide { rpc GetF
流程代码可以是run here. 使用 flow,我有一个函数,它接受一个键值对对象并获取它的值 - 它获取的值应该是字符串、数字或 bool 值。 type ValueType = string
如果我有一个函数返回一个包含数据库信息的对象或一个空对象,如下所示: getThingFromDB: async function(id:string):Promise{ const from
我正在尝试使用javascript api和FB.ui将ogg音频文件发布到流中, 但是我不知道该怎么做。 这是我给FB.ui的电话: FB.ui( { method: '
我正在尝试删除工作区(或克隆它以使其看起来像父工作区,但我似乎两者都做不到)。但是,当我尝试时,我收到此消息:无法删除工作区 test_workspace,因为它有一个非空的默认组。 据我所知,这意味
可以使用 Stream|Map 来完成此操作,这样我就不需要将结果放入外部 HashMap 中,而是使用 .collect(Collectors.toMap(...)); 收集结果? Map rep
当我们从集合列表中获取 Stream 时,幕后到底发生了什么?我发现很多博客都说Stream不存储任何数据。如果这是真的,请考虑代码片段: List list = new ArrayList(); l
我对流及其工作方式不熟悉,我正在尝试获取列表中添加的特定对象的出现次数。 我找到了一种使用Collections来做到这一点的方法。其过程如下: for (int i = 0; i p.conten
我希望将一个 map 列表转换为另一个分组的 map 列表。 所以我有以下 map 列表 - List [{ "accId":"1", "accName":"TestAcc1", "accNumber
我是一名优秀的程序员,十分优秀!