从 Next.js 路由处理程序访问用户代理?

问题描述 投票:0回答:1

我正在尝试从 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 函数,我知道它是为中间件设计的,但由于某种原因,中间件似乎对路由处理程序没有影响。 我也尝试过:

  1. 标题功能
  2. 使用 req.headers.get("User-Agent")

并且所有方法都会返回

null
/空字符串值。我知道该请求不会发送空用户代理,因为如果我向 Vercel 上的同一托管项目发送请求并打开日志,该请求会显示有效的用户代理列。

javascript typescript next.js nextjs-api-router
1个回答
0
投票

问题是因为您指定:

export const dynamic = "force-static";

您告诉 Next.js 在构建时生成路线。静态路由是预渲染的,并且在运行时无法访问 req 对象,因为它们是在没有请求上下文的情况下生成的。

此外,在路由处理程序(如 GET 函数)中,您会收到一个标准的 Request 对象,而 userAgent 可能无法按预期工作。

删除它,它应该出现在

req.headers.get("user-agent")

© www.soinside.com 2019 - 2024. All rights reserved.