reactjs - 未捕获( promise )TypeError : Cannot read property 'headers' of undefined

标签 reactjs next.js

因此,我尝试在我的应用程序中传递用户的 IP 地址,如下所示:

pages/Item.js

const Item = props => (
  <div>
    <SingleItem id={props.query.id} userIP={props.userIP} />
  </div>
);

Item.getInitialProps = async ({ req }) => {
  const userIP = req.headers['x-real-ip'] || req.connection.remoteAddress
  return { userIP }
}

export default withAmp(Item, { hybrid: true });

但在导航到该页面时收到上述错误消息(参见附图)。但是,如果我对页面进行硬重新加载,IP 详细信息就会正确显示到页面上。

我在这里忽略了什么,有没有更好的方法来实现这一点,例如从 _document.js 中的 header 获取 IP 地址?

enter image description here

最佳答案

req 仅当在服务器上调用 getInitialProps 时才可用。这就是当您在页面上刷新时它会起作用的原因。

导航到页面时,没有服务器渲染,因此将在客户端调用 getInitialProps。因此,req 将是未定义的。

您可以将赋值包装在条件中以检查是否定义了 req 来防止错误:

Item.getInitialProps = async ({ req }) => {
  let userIP
  if (req) {
    userIP = req.headers['x-real-ip'] || req.connection.remoteAddress
  }
  return { userIP }
}

但是,如果您希望每个页面上都有 userIP 可用,无论是服务器还是客户端呈现,那么您将需要找到一种方法在首次加载时存储它,无论是哪个页面可能是。

也许您可以使用上下文来存储它。

这里有一个使用上下文的示例: https://github.com/zeit/next.js/tree/master/examples/with-context-api

我希望这会有所帮助。

关于reactjs - 未捕获( promise )TypeError : Cannot read property 'headers' of undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56174562/

相关文章:

java - 在reactjs中集成Bootstrap的进度条 - 从superagent调用java servlet API

javascript - 为什么不会 react 类打印 json 除非 props

javascript - ReactJS 中的 prevState 是什么?

javascript - 轻松设置 react redux with next.js (React)

javascript - NextJS : dynamic router. 路径名不显示路径,但文件名 - 如何获取路径中的单词?

node.js - 如何用 fetch api 正确替换 axios api 并映射到 nodeJS 中接收到的数据?

javascript - Div 在提交表单时创建

javascript - 如何在 Next.js 组件中使用 SVG 图像?

javascript - 页面在初始页面加载时有效,但如果我刷新页面,我会收到 Zeit、Nextjs 和现在的 404 错误

typescript - 棱镜 : select on many to many with multiple conditions