我正在使用连接到 MongoDB 的 express API,当我查询 DB 以获取结果时,我只能在回调范围内使用它们,甚至在使用 console.log 时我将结果的值分配给全局声明的变量。 log(),结果未定义
这是我的代码
const MongoClient = require('mongodb').MongoClient;
const express = require('express');
const assert = require('assert');
const app = express();
const PORT = process.env.PORT||13000;
app.get('/',(req,res) => {
let myIncomingData;
const url = 'mongodb://localhost:27017/';
MongoClient.connect(url,{useNewUrlParser:true},(err,db)=>{
assert.equal(err,null);
db.db('my_posts').collection('posts').find().toArray((err,result) =>{
assert.equal(err,null);
console.log(result); // here the result gets printed
myIncomingData = result;
}); // db.collection
db.close();
}); // MongoClient.connect
console.log(myIncomingData); // print undefined why ??
}) // app.get
app.listen(PORT,()=>console.log('server is running ...'))
node 是异步的,所以在你做的时候console.log
, ,myIncomingData
仍然是未定义的(你甚至可以按顺序看到这一点console.logs
——首先它会从那一刻开始记录未定义的,console.log
然后它会记录console.log
回调中的)。如果你想看到它的实际效果,你可以尝试做一些类似的事情setTimeout(() => console.log(myIncomingData), 5 * 1000)
——通过延迟 5 秒,你可以非常确定回调代码已经运行,如果你想用这个值做任何进一步的事情,你会需要在回调中完成(内联或调用另一个函数)
async/await
或者Promises
可以使这样的代码更易于阅读和推理。如果您想继续使用回调,则值得查看回调教程以确保您了解它们发生了什么。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句