Next.js 14 + MongoDB App Router中GET请求报错:res.status不是函数
问题解决:TypeError: res.status is not a function(Next.js App Router + MongoDB)
你的核心问题是混淆了Next.js Pages Router和App Router的API路由写法。App Router(app目录下的route.ts文件)的API函数不使用NextApiRequest/NextApiResponse类型,也没有res参数——它遵循Web标准,直接接收Request对象,并且需要返回Response(或Next.js封装的NextResponse)。
错误原因拆解
你写的两种代码都沿用了Pages Router的API模式:
- 引入了
NextApiRequest/NextApiResponse,但App Router的API函数根本不会传入res参数,你拿到的res是不符合预期的对象,调用res.status()自然会报错。 - 即便能从数据库获取到数据,错误的响应写法也会触发服务器500错误。
修正后的代码示例
用App Router的正确写法重写你的API:
import User from "../../model/User"; import clientPromise from "../../lib/mongodb"; import { NextResponse } from "next/server"; export async function GET() { try { await clientPromise; const allUsers = await User.find({}); console.log(allUsers); return NextResponse.json(allUsers, { status: 200 }); } catch (err) { console.error(err); return NextResponse.json({ error: err.toString() }, { status: 500 }); } }
关键改动说明
- 移除
NextApiRequest/NextApiResponse和NextApiHandler的导入,改用NextResponse(Next.js提供的封装,比原生Response更适配框架场景)。 - 函数不再接收
res参数,直接通过NextResponse.json()返回响应,状态码作为第二个参数传入。 - 统一用
try/catch处理异步错误,避免混用await和then/catch,代码逻辑更清晰。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

