我正在使用连接到MongoDB的Express API,当我查询数据库以获取结果时,我只能在回调范围内使用它们,甚至当将结果的值分配给全局声明的变量时,使用console.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 ...'))
答案 0 :(得分:0)
节点是异步的,因此在执行 .dropdown-submenu {
position: relative;
}
.dropdown-submenu .dropdown-menu {
top: 0;
left: 100%;
margin-top: -1px;
}
时,console.log
仍未定义(您甚至可以按myIncomingData
的顺序看到它-首先它将记录第二个console.logs
中未定义的内容,然后记录回调中的console.log
。如果您希望看到此效果,可以尝试执行console.log
之类的操作-通过延迟5秒,可以确定回调代码将运行,并且如果您想进一步执行此操作值,则需要在回调中完成操作(内联或通过调用其他函数)
async/await
或Promises
可以使这样的代码更易于阅读和推理。如果您想继续使用回调,那么有必要看一下回调教程,以确保您了解回调发生了什么。