next.js:typeError:在生产中使用标头()时无法读取未定义的属性(读取'bind') 我在next.js应用程序上工作,并使用headers()在服务器组件中检索用户的IP地址。它在开发模式(NPM Run Dev)中正常工作,但是在构建后(NPM Run Build)...

问题描述 投票:0回答:1
这个错误指向我的getip.ts实用程序文件中的

await headers()

函数。
我的设置的简化版本:
file结构:

Src/app/page.tsx

"use server" import { getIP } from "./_util/getIP"; export default async function Home() { const ip = await getIP(); return ( <h1>TEST IP {ip}</h1> ); }

src/app/_util/getip.ts

    "use server" import { headers } from "next/headers"; export async function getIP() { const requestHeaders = await headers(); // this line generate the error const remoteIP = requestHeaders.get("x-forwarded-for")?.split(":").pop() || "unknown"; return remoteIP; }
步骤复制:

  • run
  • run app
当访问生产中的标头()时发生错误。

这里可用的存储库以供参考:githubrepo

我尝试过的事物
  1. I确认Getip仅称为服务器端。
    在Headers()上使用等待的等待,以测试它是否与异步处理有关
  2. 检查了Next.js文档和各种GitHub问题,但找不到相关的解决方案。
  3. 有人在生产模式下遇到了与headers()的类似问题?任何见解都将不胜感激!
        
  4. 问题本身本身不是与运行时环境有关的问题。在开发模式下,Next.js模拟完整的服务器上下文,以便theheaders()API按预期工作。但是,当您使用NPM启动时在本地构建和运行应用程序时,并未完全提供必要的服务器上下文,因此丢失了内部绑定()。相比之下,当部署到Vercel时,Next.js在其预期的无服务器/边缘环境中运行,其中请求上下文(以及标题API)被正确设置。
  5. 换句话说,错误

“无法读取未定义的属性(读取'绑定')” 在您的生产中,因为应该提供的功能 请求标题没有像在Vercel上的那样绑定。

如果您希望在类似生产的环境中在本地测试您的应用程序,则可以考虑以下方法:

使用自定义服务器:使用Node.js和Express实现自定义服务器可以提供对服务器环境的更多控制,从而可以更好地模拟生产上下文。

修改编译的代码:
    作为解决方案,您可以在编译代码中跟踪错误并调整返回函数,以确保所有必要的方法都正确绑定。这涉及将编译的输出修改以绑定诸如
  • npm run build
  • npm run start
  • append
delete

get
next.js
1个回答
0
投票
has

set

getSetCookie

forEach

keys

values

entries符号之类的方法。这是您如何调整返回函数的一个示例:

iterator


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.