首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Contentful React App在水化后出现错误

Contentful React App在水化后出现错误
EN

Stack Overflow用户
提问于 2020-10-13 22:07:50
回答 1查看 114关注 0票数 0

我正在制作一个SSR react contentful应用程序,在我正确地对应用程序进行消重之后,我得到了一个与我从服务器上正确获得的数据相关的错误。它认为我传递给contentful API的密钥不存在,但对于服务器请求确实存在。我不太明白为什么它会以这种方式抛出这个错误。如果有人遇到这种情况,这里的代码没有关键字,原因很明显。

https://github.com/JoshBowdenConcepts/goop-troop-collective

当前错误如下所示:

代码语言:javascript
复制
Uncaught TypeError: Expected parameter accessToken
    K contentful.js:53
    267 client.js:8
    l (index):1
    100 main.27827bac.chunk.js:1
    l (index):1
    r (index):1
    t (index):1
    <anonymous> main.27827bac.chunk.js:1
contentful.js:53:10

干杯,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-13 23:54:52

问题是,虽然服务器端呈现的树将siteInfo传递给<App />,但客户端捆绑包的index.js不会。如果您正在运行React的开发构建,您可能会看到与DOM不同的水合化树相关的错误。您需要以某种方式将初始属性传递给客户端-一个流行的技巧是将它们注入全局变量并传递,例如:

服务器:

代码语言:javascript
复制
getSiteInformation().then((info) => {
  const siteInfoInjector = `<script>window.__INITIAL_PROPS = ${JSON.stringify(
    info.fields
  )};</script>`;

  return res.send(
    data.replace(
      '<div id="root"></div>',
      `${siteInfoInjector}
      <div id="root">
      ${ReactDOMServer.renderToString(
        <App siteInfo={info.fields} />
      )}
      </div>`
    )
  );
});

客户端的index.js

代码语言:javascript
复制
const initialProps = window.__INITIAL_PROPS;

ReactDOM.hydrate(
  <React.StrictMode>
    <App siteInfo={initialProps} />
  </React.StrictMode>,
  document.getElementById("root")
);

但是需要注意的是,这会将字符串化的结果直接注入到HTML中,这意味着如果您的siteTitlehello </script><script>alert(1),那么您手上就有一个XSS。解决这个问题的一种方法是对初始值进行base-64编码:

服务器:

代码语言:javascript
复制
const siteInfoInjector = `<script>window.__INITIAL_PROPS = "${Buffer.from(
  JSON.stringify(info.fields)
).toString("base64")}";</script>`;

客户端:

代码语言:javascript
复制
const initialProps = JSON.parse(atob(window.__INITIAL_PROPS));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64336812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档