在JavaScript代码块之外访问包含MongoDB数据的变量?
在下面的代码中,我试图使变量“theNames”在其他函数中可用。当我试图在当前代码块之外访问它时,它返回为未定义。我尝试了在当前驻留的代码块之外声明变量,但得到了相同的结果。我不能肯定,但我怀疑这可能是因为MongoConnect代码稍后执行在JavaScript代码块之外访问包含MongoDB数据的变量?,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,在下面的代码中,我试图使变量“theNames”在其他函数中可用。当我试图在当前代码块之外访问它时,它返回为未定义。我尝试了在当前驻留的代码块之外声明变量,但得到了相同的结果。我不能肯定,但我怀疑这可能是因为MongoConnect代码稍后执行 var express = require("express"); var app = express(); var port = 3000; var bodyParser = require('body-parser');
var express = require("express");
var app = express();
var port = 3000;
var bodyParser = require('body-parser');
var MongoClient = require('mongodb').MongoClient;
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
var mongoose = require("mongoose");
mongoose.Promise = global.Promise;
mongoose.connect("mongodb://localhost:27017/node-demo");
var nameSchema = new mongoose.Schema({
firstName: String,
lastName: String
});
var User = mongoose.model("User", nameSchema);
app.get("/", (req, res) => {
res.sendFile(__dirname + "/index.html");
});
app.post("/addname", (req, res) => {
var myData = new User(req.body);
myData.save()
.then(item => {
res.send("Name saved to database");
User.collection
})
.catch(err => {
res.status(400).send("Unable to save to database");
});
});
listNames = () => {
var url = 'mongodb://localhost:27017/node-demo';
var theNames;
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("node-demo");
//Find the first document in the customers collection:
dbo.collection("users").find({}).toArray(function(err, result) {
if (err) throw err;
theNames = result;
console.log(theNames); //This part of the code works as expected.
db.close();
});
});
}
app.listen(port, () => {
console.log("Server listening on port " + port);
});
下面是我如何试图修改代码以获得期望的结果,但在本例中,“theNames”返回为“undefined”
因为MongoConnect代码是第二次执行的
。。。关闭时,theNames
被异步设置为一个值-但是您显示的代码不会有任何问题,因为theNames
从未在回调之外被引用。toArray
回调-所以。。简而言之,问题中显示的代码没有问题,因此没有问题solution@jaromandaX对不起,我认为我原来的帖子没有很好地解释这个问题。请看我上面的编辑。这是由于nodejs的异步特性。尝试使用异步等待而不是回调。使listNames函数异步并从中返回名称结果。然后执行以下操作theNames=Wait listNames()。那么它应该会起作用。
var theNames;
listNames = () => {
var url = 'mongodb://localhost:27017/node-demo';
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("node-demo");
//Find the first document in the customers collection:
dbo.collection("users").find({}).toArray(function(err, result) {
if (err) throw err;
theNames = result;
console.log(theNames);
db.close();
});
});
}
console.log(`Here is a list of theNames: ${theNames}`)