Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript代码块之外访问包含MongoDB数据的变量?_Javascript_Mongodb_Mongoose - Fatal编程技术网

在JavaScript代码块之外访问包含MongoDB数据的变量?

在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');

在下面的代码中,我试图使变量“theNames”在其他函数中可用。当我试图在当前代码块之外访问它时,它返回为未定义。我尝试了在当前驻留的代码块之外声明变量,但得到了相同的结果。我不能肯定,但我怀疑这可能是因为MongoConnect代码稍后执行

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}`)