如何解决使用pipe时,并发React渲染器的最大数量已超出
我有一个在Kubernetes中运行的带有SSR的React应用程序。几天没有重新启动Pod,我收到此错误:https://reactjs.org/docs/error-decoder.html/?invariant=304。
我使用ReactDOMServer.renderToNodeStream
和pipe()
并根据错误:
如果您没有正确销毁React提供的Readable,可能会发生这种情况。如果您不再希望从中读取.destroy()并且没有读到结尾,请确保对其调用.destroy()。 如果您使用.pipe(),这应该是自动的。
这是我的服务器渲染器:
export function renderOnServer(res,controller) {
return new Promise((resolve,reject) => {
try {
const index = controller.getIndexHTML();
const view = controller.getView();
const indexHTML = `<!DOCTYPE html>${ReactDOMServer.renderToStaticmarkup(index)}`;
const chunks = indexHTML.split("{{STREAMED_CONTENT}}");
const firstChunk = chunks.shift();
const lastChunk = chunks.shift();
res.write(firstChunk);
const stream = ReactDOMServer.renderToNodeStream(view);
stream.pipe(res,{ end : false });
stream.on("end",() => {
res.write(lastChunk);
res.end();
resolve();
});
} catch(err) {
reject(err);
}
});
}
我使用pipe()
,但我也处理代码中的end
事件。可能是问题的原因吗?还是应该专注于代码的另一部分?
感谢您的帮助。谢谢。
解决方法
您的代码似乎完全没问题。也许这是一些奇怪的React库的问题。您可以执行以下操作:
- 将ReactJS库和NodeJS更新到当前版本
- 尝试在“ end”回调函数中销毁流:
stream.on("end",() => {
stream.destroy(); // but I think it is not necessary
res.write(lastChunk);
res.end();
resolve();
});
- 您应该添加
stream.on("error",() => something to do)
回调函数
或者您可以将renderToNodeStream调用替换为renderToString。它不像使用流那样高效地使用内存,但在您的情况下更安全。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。