提问者:小点点

回调函数内部无法访问的变量


我有一个变量DeleteFlag,它在函数中是不可访问的,即使变量的作用域是全局的。

解释(请同时参考我的代码):

在这里,我试图获取MongoDB集合的详细信息,该集合存储了一个日期文档(result[I].date)。 变量difresult存储当前日期和从MongoDB获取的日期之间的差异。 假设difresult的值大于特定阈值,那么处理相应的if-else条件。

我的if块,即if(difresult>20000)有一个子进程,exec函数和一个用于删除MongoDB集合的回调函数,现在在这个函数中我正在尝试访问排序不可访问的vardeleteFlag。 为什么? 我如何在我的函数中使is可访问?

app.js

MongoClient.connect("mongodb://localhost:27017/", {
  useUnifiedTopology: true
}, function(err, db) {
  if (err) throw err;
  var dbo = db.db("dbName");
  dbo.collection("colName").find({}).toArray(function(err, result) {
    if (err) throw err;
    for (var i = 0; i < result.length; i++) {
      var difResult = Math.round((today - result[i].date));
      var deleteFlag = result[i].date; // Declared here and should be accessbile within the function
      console.log("Delete Flag " + deleteFlag.toISOString()); //Show correct value here
      console.log("Result Date " + result[i].date);
      if (difResult > 20000) {
        var result2 = cp.exec("rm -rf /path/" + deleteFlag.toISOString(), function(error, stdout, stderr) {
          if (error !== null) {
            console.log('exec error: ' + error);
            return res1.status(500).json({
              error: "Failed!"
            });
          } else {
            MongoClient.connect("mongodb://localhost:27017/", {
              useUnifiedTopology: true
            }, function(err, db) {
              console.log("Delete Flag From Collection ", +deleteFlag.toISOString());
              //The above console log gives NaN or null value
              //Suggest that var deleteFlag is not accessible inside this callback function
              if (err) throw err;
              var dbo = db.db("dbName");
              var myquery = {
                date: deleteFlag
              };
              dbo.collection("colName").deleteOne(myquery, function(err, obj) {
                if (err) throw err;
                console.log("1 document deleted");
                db.close();
              });
            });
          }
        });
      } else {
        console.log("Else msg");
      }
    }
    db.close();
  });
});

共1个答案

匿名用户

您不必调用数据库两次您可以优化您的代码并按如下方式使用它

    MongoClient.connect("mongodb://localhost:27017/", {
  useUnifiedTopology: true
}, function(err, db) {
  if (err) throw err;
  var dbo = db.db("dbName");
  dbo.collection("colName").find({}).toArray(function(err, result) {
    if (err) throw err;
    for (var i = 0; i < result.length; i++) {
      var difResult = Math.round((today - result[i].date));
      var deleteFlag = result[i].date; // Declared here and should be accessbile within the function
      console.log("Delete Flag " + deleteFlag.toISOString()); //Show correct value here
      console.log("Result Date " + result[i].date);
      if (difResult > 20000) {
        var result2 = cp.exec("rm -rf /path/" + deleteFlag.toISOString(), function(error, stdout, stderr) {
          if (error !== null) {
            console.log('exec error: ' + error);
            return res1.status(500).json({
              error: "Failed!"
            });
          } else {
          var myquery = {
                date: deleteFlag
              };
              dbo.collection("colName").deleteOne(myquery, function(err, obj) {
                if (err) throw err;
                console.log("1 document deleted");
              });
          }
        });
      } else {
        console.log("Else msg");
      }
    }
    db.close();
  });
});

但是,如果出于某种原因需要调用数据库两次,则应将DeleteFlag值存储在数组中,然后在您喜欢的任何地方访问该数组

相关问题