You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:33:16