Next.js中GET请求遇405 Method Not Allowed错误(Postman/浏览器)
问题原因与解决方案
核心问题
HTTP 405错误是因为你的/api/products路由没有实现GET请求的处理函数。在Next.js App Router的API路由中,只有显式导出的GET/POST等方法函数才会被框架识别并处理对应请求,你当前只导出了POST函数,所以GET请求会被拒绝。
另外你写的fecthProducts(注意拼写错误,应为fetch)是普通内部函数,既没被Next.js识别为GET请求处理器,还错误地在API路由内部用axios请求自身API,这完全没必要。
修正代码
把原来的fecthProducts函数替换成导出的GET函数,直接在函数内查询数据库并返回数据:
import { dbConnect } from "@/app/config/dbConnect"; import { NextResponse } from "next/server"; import ProductModel from "@/app/model/addProduct"; dbConnect(); // POST 请求处理 export async function POST(req) { try { const body = await req.json(); const newProduct = await ProductModel.create(body); return NextResponse.json({ success: true, data: newProduct, // 建议把message改成data,语义更准确 }); } catch (error) { if (error.code === 11000) { return NextResponse.json({ success: false, message: "产品已存在!", }); } return NextResponse.json({ success: false, message: error.message.split(":")[2]?.trim().split(",")[0] || "查询失败", }); } } // GET 请求处理(新增) export async function GET() { try { // 直接查询数据库获取所有产品 const products = await ProductModel.find({}); return NextResponse.json({ success: true, data: products, }); } catch (error) { return NextResponse.json({ success: false, message: "获取产品列表失败:" + error.message, }); } }
关键改动说明
- 导出
GET函数:这是Next.js识别GET请求的核心,框架会自动将该函数绑定到GET请求的处理逻辑上。 - 直接操作数据库:API路由内部无需通过axios请求自身接口,直接调用
ProductModel查询数据即可,减少不必要的网络请求。 - 修复拼写错误:修正
fecthProducts的拼写问题,保证代码规范。 - 优化响应语义:将返回数据的
message字段改为data,让接口语义更清晰。
现在用Postman或浏览器访问/api/products的GET请求,就能正常获取MongoDB中的产品数据了。
内容的提问来源于stack exchange,提问作者Muhammad Anas
相关产品推荐
相关产品推荐

