使用pipe时,并发React渲染器的最大数量已超出

问题描述

我有一个在Kubernetes中运行的带有SSR的React应用程序。几天没有重新启动Pod,我收到此错误https://reactjs.org/docs/error-decoder.html/?invariant=304

我使用ReactDOMServer.renderToNodeStreampipe()并根据错误

如果您没有正确销毁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库的问题。您可以执行以下操作:

  1. 将ReactJS库和NodeJS更新到当前版本
  2. 尝试在“ end”回调函数中销毁流:
stream.on("end",() => {
   stream.destroy(); // but I think it is not necessary
   res.write(lastChunk);
   res.end();
   resolve();
});
  1. 您应该添加stream.on("error",() => something to do)回调函数

或者您可以将renderToNodeStream调用替换为renderToString。它不像使用流那样高效地使用内存,但在您的情况下更安全。