0
我希望能夠創建一個系統生成的唯一用戶名。然而,貓鼬findOne函數的異步性質讓我感到沮喪。Mongoose和NodeJS:創建一個唯一的系統生成的用戶名
我有一個generateUniqueAccountName函數,它接受一個建議的用戶名,並檢查MongoDB,如果提出的用戶名是唯一的。如果它不是唯一的,則會生成一個新名稱,直到找到唯一的用戶名。
聽起來很簡單,但即使在找到唯一名稱之前,也會退出generateUniqueAccountName。我試圖使用Q(我的實現不顯示在這裏),但無法使其工作。
希望有任何幫助。謝謝!
這是generateUniqueAccountName功能:
/**
* Returns a unique account name based on proposed name
* @param {String} proposedName
* @return {Promise}
*/
function generateUniqueAccountName(proposedName) {
return Account.findOne({accountName: proposedName})
.then(function(account) {
if (account != null) {
console.log('no can do try again: ' + proposedName);
proposedName += Math.floor((Math.random() * 100) + 1);
generateUniqueAccountName(proposedName);
} else {
console.log('proposed name is unique' + proposedName);
}
return proposedName;
})
.catch(function(err) {
console.error(err);
throw err;
});
}
generateUniqueAccountName被稱爲像這樣:
.then(function(newAccount) {
// Next generate a unique account name
console.log('Generating unique account name ...');
let proposedName = (accounts[i].acctFName + accounts[i].acctLName)
.replace(/\s/g, '');
return generateUniqueAccountName(proposedName.toLowerCase())
.then(function(accountName) {
console.log('the unique name is ' + accountName);
newAccount.accountName = accountName;
return newAccount;
})
.catch(function(err) {
throw err;
});
})
.then(saving_part);
這是一個示例輸出:
Generating unique account name ...
no can do try again: teylim
no can do try again: michaelalee
no can do try again: joeykwa
the unique name is teylim86
the unique name is michaelalee72
the unique name is joeykwa91
no can do try again: trishalee
the unique name is trishalee7
proposed name: michaelalee72 is unique
proposed name: joeykwa91 is unique
no can do try again: teylim86
no can do try again: trishalee7
proposed name: teylim8641 is unique
proposed name: trishalee734 is unique
Saving account trishalee7
縱觀trishalee,因爲你可以請參閱系統嘗試保存用戶名trishalee7,即使日誌已顯示ñtrishalee7不是唯一的名稱
哇哦!這是一個快速反應,更重要的是,解決了這個問題!感謝@alexmac。 – fab