Next.js调用MongoDB find()返回拓扑对象而非用户文档问题
问题根因
MongoDB Node.js 驱动中,collection.find() 方法不会直接返回匹配的文档集合,其返回值是一个游标(Cursor)对象。该游标继承自Node.js的EventEmitter类,自带_events、_eventsCount等内部事件属性。你直接将游标对象传入res.json()做序列化,最终输出的就是这些内部属性,而非实际查询到的用户数据。
mongosh中find()可以直接返回结果,是因为shell环境对返回的游标做了自动迭代转换,和Node.js驱动的默认行为不一致。
修复方法
在find()返回的游标后链式调用.toArray()方法,等待游标拉取所有匹配文档、转换为标准JavaScript数组后,再作为响应返回。
修正后的接口代码:
import { connectToDatabase } from "../../src/util/mongodb"; export default async function buildUser(req, res){ const { db } = await connectToDatabase(); // 调用toArray()获取实际文档数组 const users = await db.collection("users").find().toArray(); res.status(200).json(users) }
注意事项
- 若users集合数据量较大,不建议直接使用无参数的
find().toArray()拉取全量数据,建议搭配limit()、skip()做分页查询,避免接口响应过慢、服务内存占用过高。 - 你当前实现的
connectToDatabase数据库连接缓存逻辑没有问题,不需要调整。
内容的提问来源于stack exchange,提问作者Owen Winzeler
相关产品推荐
相关产品推荐

