NextJS调用/api/dates无响应 未返回结果致请求停滞问题排查
问题根因
故障由两处代码错误共同导致,现象完全匹配你描述的场景:
- 核心错误:Next.js API路由处理函数的参数顺序写反。框架约定handler第一个入参为请求对象
NextApiRequest,第二个入参为响应对象NextApiResponse,你的代码把res放在第一位、req放在第二位,导致代码中拿到的req实际是响应对象,res实际是请求对象。这直接造成req.method、req.body全部为undefined,GET请求的判断逻辑永远无法命中,代码执行完也没有向真正的响应对象写入返回内容,自然触发"API resolved without sending a response for /api/dates"的警告。 - 次要错误:MongoDB的
find({})方法返回的是查询游标,并非直接的文档结果集,必须调用.toArray()才能获取实际的查询数据,直接序列化游标不仅拿不到有效日期数据,还可能因为游标未正常释放导致请求挂起。 - 无效数据库凭据不抛错的原因:参数顺序错误导致GET请求判断逻辑不命中,数据库连接代码根本没有执行,自然不会触发连接相关的报错。
修复方案
1. 修正API路由代码
调整/pages/api/dates.ts的参数顺序,补全游标转数组逻辑,同时补全异常场景和不支持请求方法的响应,避免无响应警告:
import type { NextApiRequest, NextApiResponse } from 'next' import { connectToDatabase } from '../../lib/mongodb' export default async function handler( req: NextApiRequest, res: NextApiResponse ) { if (req.method === 'GET') { try { const { db } = await connectToDatabase() const dates = await db.collection('dates').find({}).toArray() return res.status(200).json({ message: dates, success: true, }) } catch (error: any) { return res.status(500).json({ message: error.message, success: false, }) } } res.setHeader('Allow', ['GET']) return res.status(405).end(`Method ${req.method} Not Allowed`) }
2. 其他代码说明
/components/DateAndHours.tsx中的前端fetch请求逻辑没有问题,不需要修改,接口修复后即可正常在控制台打印返回数据。/lib/mongodb.ts的数据库连接逻辑本身没有问题,接口修复后,如果填入无效MongoDB URI会正常抛出连接错误,填入正确凭据即可正常读写数据。
内容的提问来源于stack exchange,提问作者zivnadel
相关产品推荐
相关产品推荐

