我在一个非常简单的案例中测试了这一点:
//route.ts
export async function GET() {
return new Response('Hello, Next.js!', {
status: 200,
})
}
字符串
我可以通过以下方式调用此功能:
const response = await fetch(`${API_BASE_URL}generate/test`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
}
型
它返回'Hello,Next.js!'好。
但是如果我将相同的路由改为POST而不是GET,比如:
//route.ts
export async function POST() {
return new Response('Hello, Next.js!', {
status: 200,
})
}
型
并通过调用它:
const response = await fetch(`${API_BASE_URL}generate/test`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: "AA",
}
型
preflight请求现在失败了,请求返回405错误;所以似乎由于某种原因,当我将其更改为POST方法时,next.js不再处理此路由。这是一个bug,或者为什么?
我尝试过的一些事情:
- Next.js v13和v14都有同样的问题。
- 尝试使用和不使用中间件。
- 确认响应头对于预检是正确的(allowedOrigin、allowedMethods和allowedHeaders都可以)。
- 检查发现,当我调用我的路由时,next.js说它正在编译特定的路由,所以它似乎识别它,但出于某种原因没有处理它。
即使在最简单的情况下,我也无法让POST方法API路由器工作。可能是什么问题?
1条答案
按热度按时间jogvjijk1#
以下是我使用的解决方案:
在中间件.ts中:
字符串
值得注意的问题是:CORS对GET和POST请求的处理方式不同,所以我的测试是有缺陷的。你必须在OPTIONS请求上设置CORS头(如果没有在每个route.ts中定义OPTIONS,那么就提前返回)以及正常请求。感谢phil帮助我解决这个问题。