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

Node.js对接MongoDB发起请求返回undefined是什么原因?

问题原因及修正方案

核心错误点

    1. getUser函数混用异步回调与async/await语法,且无正确返回值:调用toArray时传入回调函数会导致该方法不返回Promise,await无法拿到查询结果,同时回调函数内的return仅作用于回调本身,不会作为getUser的返回值,函数默认返回undefined。
    1. 路由层未正确执行getUser函数:代码中await getUser仅引用了函数对象,未加括号执行,也未传入函数要求的client、集合名、数据库名三个必传参数。
    1. 数据库连接逻辑错误:原有main函数执行完成后会关闭MongoClient连接,路由请求触发时数据库连接已经关闭,无法正常执行查询。

修正后的代码

1. 修正db_connection.js逻辑

const { MongoClient } = require('mongodb');
require('dotenv').config();

// 读取环境变量
const mongo_user = process.env.MONGO_USER;
const mongo_pwd = process.env.MONGO_PWD;
const mongo_db = process.env.MONGO_DB;

const uri = `mongodb+srv://${mongo_user}:${mongo_pwd}@cluster0.ynvbj.mongodb.net/${mongo_db}?retryWrites=true&w=majority`
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true })

// 初始化Mongo连接,服务启动时调用
async function initMongoConnect() {
  try {
    await client.connect();
    console.log('MongoDB连接成功');
  } catch (e) {
    console.error('MongoDB连接失败:', e);
    process.exit(1);
  }
}

// 修正后的getUser函数
async function getUser(client, coll, mongo_db){
  const collection = client.db(mongo_db).collection(coll);
  const results = await collection.find({dni: 38383838}).toArray();
  console.log(results);
  return results;
}

// 导出所需变量和方法
module.exports = {
  initMongoConnect,
  client,
  mongo_db,
  getUser,
  // 其余getOrder、getProducts方法按相同规则修正后导出
}

2. 修正app.js逻辑

const express = require('express')
const app = express()
require('dotenv').config();
const { initMongoConnect } = require('./db_connection');

// 配置项
app.set('port', process.env.PORT || 3000)

// 中间件
app.use(express.urlencoded({extended:false}))
app.use(express.json())

// 路由注册
app.use('/api', require('./api_routes'))

// 先连接数据库再启动服务
initMongoConnect().then(() => {
  app.listen(app.get('port'), ()=> {
    console.log(`服务已启动,端口: ${app.get('port')}`)
  })
})

3. 修正路由逻辑

const {getUser, client, mongo_db} = require('./db_connection')
const {Router} = require('express')
const router = Router()

// 查询用户接口
router.get('/users', async (req, res) => {
  try {
    // 正确调用getUser并传入参数
    let data = await getUser(client, 'users', mongo_db);
    res.json({data});
  } catch (err) {
    console.error('查询失败:', err);
    res.status(500).json({error: '服务器内部错误'});
  }
})

module.exports = router;

内容的提问来源于stack exchange,提问作者Tina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:48:04