2017-09-20 62 views
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不是唯一的名稱

回答

1

所有你需要做的是generateUniqueAccountName(proposedName)之前添加return聲明:

function generateUniqueAccountName(proposedName) { 
    return Account 
    .findOne({accountName: proposedName}) 
    .then(function(account) { 
     if (account) { 
     console.log('no can do try again: ' + proposedName); 
     proposedName += Math.floor((Math.random() * 100) + 1); 
     return generateUniqueAccountName(proposedName); // <== return statement here 
     } 
     console.log('proposed name is unique' + proposedName); 
     return proposedName; 
    }) 
    .catch(function(err) { 
     console.error(err); 
     throw err; 
    }); 
} 
+0

哇哦!這是一個快速反應,更重要的是,解決了這個問題!感謝@alexmac。 – fab