Node.js对接MongoDB发起请求返回undefined是什么原因?
问题原因及修正方案
核心错误点
getUser函数混用异步回调与async/await语法,且无正确返回值:调用toArray时传入回调函数会导致该方法不返回Promise,await无法拿到查询结果,同时回调函数内的return仅作用于回调本身,不会作为getUser的返回值,函数默认返回undefined。
- 路由层未正确执行
getUser函数:代码中await getUser仅引用了函数对象,未加括号执行,也未传入函数要求的client、集合名、数据库名三个必传参数。
- 路由层未正确执行
- 数据库连接逻辑错误:原有
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
相关产品推荐
相关产品推荐

