如何将Node.js操作MongoDB的异步函数改为同步,避免返回undefined
核心原因
这是异步代码执行顺序导致的问题:MongoClient.connect、collection.find().toArray都是异步IO操作,调用后不会阻塞后续代码执行,search函数会直接运行到末尾的return datad,此时数据库查询还未完成,datad还没被赋值,自然返回undefined。
解决方案
方案1:使用回调函数(兼容现有代码写法)
你定义的search函数已经预留了callback参数,直接用回调传递结果即可,所有需要用到查询结果的逻辑都放到回调函数内执行:
var MongoClient = require("mongodb").MongoClient; var url = "mongodb://localhost:27017/"; function search(dbol, collection, query, callback) { MongoClient.connect(url, function (err, db) { if (err) throw err; var dbo = db.db(dbol); dbo .collection(collection) .find(query) .toArray(function (err, result) { if (err) throw err; const datad = JSON.stringify(result); console.log("函数内部输出:", datad); db.close(); // 通过回调向外传递结果 callback(datad); }); }); } var query = { user: "admin" }; search("storageinterface", "user", query, function(res) { console.log("外部拿到的结果:", res); })
方案2:Promise + async/await(更推荐,避免回调地狱)
把查询逻辑封装为返回Promise的函数,用await等待异步执行完成后再打印结果,逻辑更清晰符合同步代码的阅读习惯:
var MongoClient = require("mongodb").MongoClient; var url = "mongodb://localhost:27017/"; function search(dbol, collection, query) { return new Promise((resolve, reject) => { MongoClient.connect(url, function (err, db) { if (err) return reject(err); var dbo = db.db(dbol); dbo .collection(collection) .find(query) .toArray(function (err, result) { if (err) return reject(err); const datad = JSON.stringify(result); db.close(); resolve(datad); }); }); }) } async function runQuery() { var query = { user: "admin" }; const res = await search("storageinterface", "user", query); console.log("外部拿到的结果:", res); } runQuery();
内容的提问来源于stack exchange,提问作者skeyvin
相关产品推荐
相关产品推荐

