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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:20:15