我正在尝试从 next.js 项目中的路由处理程序访问请求的 User-Agent 标头。 这是一个例子:
import { userAgent } from "next/server";
export const dynamic = "force-static";
export async function GET(req: Request) {
console.log(userAgent(req))
return Response.json({ error: false, message: "Hello, world!" });
}
console.log
函数返回:
{
ua: '',
browser: { name: undefined, version: undefined, major: undefined },
engine: { name: undefined, version: undefined },
os: { name: undefined, version: undefined },
device: { vendor: undefined, model: undefined, type: undefined },
cpu: { architecture: undefined },
isBot: false
}
上面的代码使用了 userAgent 函数,我知道它是为中间件设计的,但由于某种原因,中间件似乎对路由处理程序没有影响。 我也尝试过:
并且所有方法都会返回
null
/空字符串值。我知道该请求不会发送空用户代理,因为如果我向 Vercel 上的同一托管项目发送请求并打开日志,该请求会显示有效的用户代理列。
问题是因为您指定:
export const dynamic = "force-static";
您告诉 Next.js 在构建时生成路线。静态路由是预渲染的,并且在运行时无法访问 req 对象,因为它们是在没有请求上下文的情况下生成的。
此外,在路由处理程序(如 GET 函数)中,您会收到一个标准的 Request 对象,而 userAgent 可能无法按预期工作。
删除它,它应该出现在
req.headers.get("user-agent")