私はmongooseとnodejsを持つmongodbにユーザー名が存在するかどうかを調べるために関数を再帰的に使用します。未定義の戻り値mongoose/nodejs再帰関数
私はコールバックを使用しますが、なぜ私の関数が未定義の結果を返すのか分かりません。私たちを手伝ってくれますか ?
感謝;)
var mongoose = require('mongoose');
var debug = require('debug')('gc:model:User');
var UserSchema = new Schema({
username: {type: String, required: true, trim: true, index: {unique: true, dropDups: true}},
email: {type: String, trim: true},
role: {type: String, required: true, default: 'user'},
});
generateUsername = function (username, number) {
'use strict';
var i = 0;
var usernames = [];
usernames.push(username);
while (i < number) {
var count = parseInt(usernames[i].substr(-1));
if (count >= 0) {
count += 1;
} else {
count = 0;
}
usernames.push(usernames[i].substring(0, count === 0 ? usernames[i].length : usernames[i].length - 1) + count);
i++;
}
return usernames;
};
findUniqueUsername = function (usernames, cb) {
'use strict';
if (usernames.length === 0) {
return cb(null);
}
// If one of the username is undefined, go the next one
if (typeof usernames[0] === 'undefined') {
usernames.shift();
findUniqueUsername(usernames);
}
_db.User.findOne({'username': usernames[0]}).exec(function (err, user) {
if (err) return cb(err);
if (user) {
debug('Bu ! => ', usernames[0]);
usernames.shift();
findUniqueUsername(usernames);
}
else {
debug('GooD ! => ', usernames[0]); // Value OK i have
return usernames[0]; // Value Not OK undefined :(
}
});
};
var namestart = "jobs";
var usernameTries = generateUsername(namestart, 100);
var username = findUniqueUsername(usernameTries); // is undefined
[非同期呼び出しからの応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-呼び出し) – nem035
どの関数呼び出しが未定義に戻っていますか?あなたのコンソールに何かエラーがありますか? – Cruiser
おそらく 'findUniqueUsername'は非同期呼び出しを含んでいますが、OPは同期メソッドで結果を読み取ろうとします。つまり、' var username = findUniqueUsername(usernameTries); 'です。ほとんどの場合、上記の提案の複製としてクローズする必要があります – nem035