javascript的范围问题(node.js + mongo.db)

我遇到了我的convertKey函数的一些问题,我怀疑这是由于范围问题。 基本上,我尝试从我的mongo数据库检索logging,并将其存储在一个countvariables中,但是当我尝试返回它时,我得到“undefined”。 令人惊讶的是, 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; }); }); } }); }; } 

你从callback函数返回到db.studentsList.find而不是从你的convertKey函数。

如果你想要从db.studentsList.find返回值,你需要提供一个callbackconvertKey或可能使用Promise库使convertKey延期/未来。 否则,你的函数会在等待嵌套的asynchronous函数完成时立即返回。

callback允许你传递你正在查找的结果(例如callback(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