Node.js操作MongoDB的Pedidos集合返回undefined问题求助
问题:MongoDB集合查询返回undefined,相同逻辑在其他项目正常运行
无法从MongoDB的Pedidos集合中返回文档,相同操作在另一个项目可正常运行,当前查询返回undefined,需要排查原因。
相关截图说明
- 第一张截图显示MongoDB中存在
Pedidos集合,且集合内有有效文档数据。 - 补充截图显示代码运行时,回调函数中的
results能打印出文档内容,但外层的result变量显示为undefined。
相关代码
server.js
require('dotenv').config(); const express = require("express"); const app = express(); const path = require("path"); const routes = require('./routes'); const mongoose = require('mongoose'); mongoose.connect(process.env.DB_URI, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => { console.log("Conectado no banco"); app.emit('pronto'); }) .catch(e => console.log(`Erro: ${e}`));
pedidosModels.js
const mongoose = require('mongoose'); require('dotenv').config(); const mongoClient = require('mongodb').MongoClient const client = new mongoClient(process.env.DB_URI, ); async function buscaPedidos() { try { const db = client.db('hamburgueria'); console.log("Estou em BUSCAR PEDIDOS") const result = await db.collection('Pedidos').find({}).sort({ senha: -1 }).limit(5).toArray(function (err, results) { console.log(`results ${results}`); console.log(`PEDIDOS: ${JSON.stringify(result)}`) });; } finally { client.close(); } };
排查与解决方案
1. 混合使用回调与async/await导致变量赋值错误
你在toArray方法中同时使用了回调函数和await,但toArray传入回调时不会返回Promise,因此await拿到的result必然是undefined,实际查询结果只存在于回调的results参数里。
修复代码:移除回调,直接用await接收toArray的返回值:
async function buscaPedidos() { try { await client.connect(); // 补充客户端连接步骤 const db = client.db('hamburgueria'); console.log("Estou em BUSCAR PEDIDOS") const result = await db.collection('Pedidos').find({}).sort({ senha: -1 }).limit(5).toArray(); console.log(`results ${result}`); console.log(`PEDIDOS: ${JSON.stringify(result)}`) return result; } finally { await client.close(); } };
2. 缺少MongoClient连接步骤
代码中创建了MongoClient实例,但未调用client.connect()就直接操作数据库,导致连接未建立,无法获取数据。必须在数据库操作前添加await client.connect();。
3. 避免Mongoose与MongoClient混用的冗余
项目中同时引入了Mongoose和原生MongoClient,若已通过Mongoose完成数据库连接,可直接用Mongoose操作集合,简化连接管理:
// 用Mongoose方式查询 const Pedido = mongoose.model('Pedido', new mongoose.Schema({}, { collection: 'Pedidos' })); // 指定对应集合名 async function buscaPedidos() { const result = await Pedido.find({}).sort({ senha: -1 }).limit(5); console.log(`PEDIDOS: ${JSON.stringify(result)}`); return result; }
内容的提问来源于stack exchange,提问作者Mariana Arruda
相关产品推荐
相关产品推荐

