首页 > 解决方案 > renderToNodeStream [object Object] 服务器端渲染

问题描述

ReactDOMServer.renderToNodeStream(
      <Html
        helmet={Helmet.renderStatic()}
        window={{
          __STATE__: ctx.store.getState()
        }}
        css={css}
        scripts={scripts}
        locale={ctx.locale}
        url={ctx.request.url}
        dynamicData={dynamicData}
      >
        {components}
      </Html>
    )

在此处输入图像描述

我找不到这个问题的原因。我想切换到,renderToNodeStream但它的工作方式有点不同renderToStaticMarkup,我找不到它。

标签: reactjsreact-dom

解决方案


您不能将商店作为 json 对象传递给 html 标记。您可以使用 JSON.stringify 并像这样附加商店,

`window={{
    __STATE__: JSON.Stringify(ctx.store.getState())
}}`

如果商店包含从 API 响应呈现的任何恶意脚本标记,则也会在 HTML 中执行。为了避免这种跨站点脚本(XSS),我强烈建议导入serialize( serialize-javascript) 包并像这样使用它。

`window={{
   __STATE__: serialize(ctx.store.getState())
}}`

序列化将确保 HTML 字符和 JavaScript 行终止符自动转义。


推荐阅读