1

convertKey関数でいくつかの問題が発生していますが、スコープの問題が原因であると思われます。基本的に、mongoデータベースからレコードを取得してカウント変数に格納しようとしますが、それを返そうとすると「未定義」になります。驚くべきことに、 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;
          });
        });
      }
    });
  };
}
4

1 に答える 1

1

db.studentsList.find関数からではなく、コールバックから戻っていますconvertKey

内から値を返すdb.studentsList.find場合は、にコールバックを提供するかconvertKey、Promiseライブラリを使用しconvertKeyて据え置き/将来を作成する必要があります。それ以外の場合、ネストされた非同期関数が完了するのを待っている間、関数はすぐに戻ります。

コールバックを使用すると、探している結果を渡すことができます(例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
于 2013-03-18T06:15:12.447 に答える