我想使用函數遞歸來查看用戶名是否存在於mongodb中,並且mongoose和nodejs。未定義的返回值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
哪個函數調用返回undefined?控制檯中是否有錯誤? – Cruiser
可能是'findUniqueUsername',它包含一個異步調用,但OP試圖以同步的方式從它讀取一個結果,即'var username = findUniqueUsername(usernameTries);'。上述建議很可能應該被封閉 – nem035