Next.js 13 REST API查询参数过滤失效问题求助
解决Next.js 13 API无法接收查询参数的问题
错误原因
在Next.js 13的App Router API路由中,传入的req是标准Web Request对象,并非Express风格的请求对象,不存在req.query属性。你直接将req.query传给Portfolio.find(),实际上传入的是undefined,而MongoDB的find(undefined)会返回集合中的全部数据,这就是过滤失效的原因。
修复后的代码
import Portfolio from "@/models/portfolio"; import connectDB from "@/utils/db"; import { NextResponse } from "next/server"; export const GET = async (req) => { await connectDB(); // 从请求URL中提取查询参数 const searchParams = new URL(req.url).searchParams; // 将URLSearchParams转换为普通对象 const queryParams = Object.fromEntries(searchParams); // 执行过滤查询 const PortfolioItems = await Portfolio.find(queryParams); return NextResponse.json({ PortfolioItems }); };
扩展:实现排序功能
如果需要同时支持排序,可以在查询参数中加入排序字段和顺序(比如?siteCategory=business&sortBy=createdAt&order=desc),修改代码如下:
import Portfolio from "@/models/portfolio"; import connectDB from "@/utils/db"; import { NextResponse } from "next/server"; export const GET = async (req) => { await connectDB(); const searchParams = new URL(req.url).searchParams; const queryParams = Object.fromEntries(searchParams); // 分离过滤参数和排序参数 const { sortBy = "_id", order = "asc", ...filter } = queryParams; // 构建排序对象 const sortOptions = { [sortBy]: order === "desc" ? -1 : 1 }; // 执行带排序的查询 const PortfolioItems = await Portfolio.find(filter).sort(sortOptions); return NextResponse.json({ PortfolioItems }); };
验证方式
重新启动开发服务器后,访问http://localhost:3000/api/portfolio?siteCategory=business,即可得到仅属于business分类的数据。
内容的提问来源于stack exchange,提问作者Md Injamul
相关产品推荐
相关产品推荐

