Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.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的作用域问题(node.js+;mongo.db)_Javascript_Node.js_Mongodb - Fatal编程技术网

javascript的作用域问题(node.js+;mongo.db)

javascript的作用域问题(node.js+;mongo.db),javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我的convertKey函数遇到了一些问题,我怀疑这是由于范围问题造成的。基本上,我尝试从mongo数据库中检索一条记录并将其存储在count变量中,但当我尝试返回它时,会得到“未定义”。令人惊讶的是,console.log(nameSearch+count)起作用,而return nameSearch+count则不起作用。如果有人能在这方面帮助我,我将不胜感激 var dbUrl = "kidstartnow", collections = ["students", "studentsL

我的convertKey函数遇到了一些问题,我怀疑这是由于范围问题造成的。基本上,我尝试从mongo数据库中检索一条记录并将其存储在count变量中,但当我尝试返回它时,会得到“未定义”。令人惊讶的是,
console.log(nameSearch+count)
起作用,而
return nameSearch+count
则不起作用。如果有人能在这方面帮助我,我将不胜感激

var dbUrl = "kidstartnow",
  collections = ["students", "studentsList"];
var db = require("mongojs").connect(dbUrl, collections);

function Student(name, src) {
  this.name = name.toLowerCase();

  //this function does not work
  this.key = convertKey(this.name);

  this.src = src;
  this.pointsTotal = 0;

  //inserts student into database
  var student = {name: this.name, key: this.key, pointsTotal: this.pointsTotal,
    src: this.src
  };
  db.students.insert(student);

  //converts name to a key by stripping white space and adding a number behind and ensures keys are unique
  //concatenates names together to form namesearch, and checks if entry exists in studentsList
  function convertKey(name) {

    var nameSearch = name.replace(/\s/g, ''),
      count = 1;



    db.studentsList.find({name: nameSearch}, function(err, student) {      
      //if nameSearch does not exist in studentsList, create entry and sets count to 1
      if(err || !student.length) {
        db.studentsList.insert({name: nameSearch, count: 1});
        count = 1;
        return nameSearch + count;
      }

      //if entry does exist, increments count by 1
      else {
        db.studentsList.update({name: nameSearch}, {$inc: {count: 1}}, function(err) {
          if(err) {
            console.log("Error incrementing records");
          }

          db.studentsList.find({name: nameSearch}, function(err, student) {
            count = student[0].count;
            //this works
            console.log(nameSearch + count)
            //but this doesn't
            return nameSearch + count;
          });
        });
      }
    });
  };
}

您正在从回调返回到
db.studentsList.find
,而不是从
convertKey
函数返回

如果希望从
db.studentsList.find
中返回值,则需要提供对
convertKey
的回调,或者可能使用承诺库使
convertKey
成为延迟/未来。否则,在等待嵌套异步函数完成时,函数将立即返回

回调允许您传递正在查找的结果(例如,
回调(nameSearch+count)

编辑

每当我对函数的返回值有疑问时,我都会将大括号与注释相匹配:

function convertKey(name) {

    var nameSearch = name.replace(/\s/g, ''),
      count = 1;

    db.studentsList.find({name: nameSearch}, function(err, student) {      
      //if nameSearch does not exist in studentsList, create entry and sets count to 1
      if(err || !student.length) {
        db.studentsList.insert({name: nameSearch, count: 1});
        count = 1;
        return nameSearch + count;
      } else {
        db.studentsList.update({name: nameSearch}, {$inc: {count: 1}}, function(err) {
          // ...
          db.studentsList.find({name: nameSearch}, function(err, student) {
             // ...
             return nameSearch + count;
          }); // end db.studentsList.find
        }); // end db.studentsList.update
      } // end else
    }); // end db.studentsList.find

    /**
     * Notice, no return value here...
     */
  }; // end convertKey

您正在从回调返回到
db.studentsList.find
,而不是从
convertKey
函数返回

如果希望从
db.studentsList.find
中返回值,则需要提供对
convertKey
的回调,或者可能使用承诺库使
convertKey
成为延迟/未来。否则,在等待嵌套异步函数完成时,函数将立即返回

回调允许您传递正在查找的结果(例如,
回调(nameSearch+count)

编辑

每当我对函数的返回值有疑问时,我都会将大括号与注释相匹配:

function convertKey(name) {

    var nameSearch = name.replace(/\s/g, ''),
      count = 1;

    db.studentsList.find({name: nameSearch}, function(err, student) {      
      //if nameSearch does not exist in studentsList, create entry and sets count to 1
      if(err || !student.length) {
        db.studentsList.insert({name: nameSearch, count: 1});
        count = 1;
        return nameSearch + count;
      } else {
        db.studentsList.update({name: nameSearch}, {$inc: {count: 1}}, function(err) {
          // ...
          db.studentsList.find({name: nameSearch}, function(err, student) {
             // ...
             return nameSearch + count;
          }); // end db.studentsList.find
        }); // end db.studentsList.update
      } // end else
    }); // end db.studentsList.find

    /**
     * Notice, no return value here...
     */
  }; // end convertKey

谢谢你!只是一个简单的跟进:我尝试添加一个回调函数,并这样调用它,但它不起作用。你知道我哪里出错了吗this.key=convertKey(this.name,function(text){returntext;})@丹东,我想你需要好好读一读,这是一篇很好的文章。基本上,您需要在回调函数中包含依赖于
text
值的所有逻辑。这与您在传递给
db.studentsList.find
的回调中所做的相同。谢谢!只是一个简单的跟进:我尝试添加一个回调函数,并这样调用它,但它不起作用。你知道我哪里出错了吗this.key=convertKey(this.name,function(text){returntext;})@丹东,我想你需要好好读一读,这是一篇很好的文章。基本上,您需要在回调函数中包含依赖于
text
值的所有逻辑。这与您在传递给
db.studentsList.find
的回调中所做的相同。