2016-06-28 132 views
0

我試圖創建一個生成不中我的數據庫(MongoDB的)存在一個隨機令牌的功能,我在用戶模式中使用獨特的屬性。這是我的函數:令牌生成和表達

var UniqueTokenGenerator = function() { 

     var token = uuid.v4(); 
     UserModel.findOne({token : token} , (err , user)=> { 

      if(err) 
       res.status(500).send(err); 
      else if(user){ 
       //1 
      }else if(!user){ 
       return token; //2 
      } 

     }); 

    }; 

我的問題:

  1. 我想如果存在令牌調用UniqueTokenGenerator或任何...像循環。
  2. 令牌不能退貨。
  3. 任何人有更好的主意嗎?

我不想使用任何庫,如jwt

回答

0

兩個答案:

首先,你並不需要檢查數據庫,以確保您的UUID是獨一無二的。 UUID非常大,在數學上你不會遇到碰撞。見Are GUID collisions possible?

其次,要做你想做的事情,你需要使你的函數是異步的,並用回調來傳遞結果。例如。

var generateUniqueToken = (callback) => { 
    var token = uuid.v4(); 
    UserModel.findOne({ token: token }, (err, user) => { 
     if(err) { 
      // First parameter of the callback is an error. 
      callback(err); 
     } else if (user) { 
      // Try again. 
      generateUniqueToken(callback); 
     } else if (!user) { 
      // First parameter of the callback is an error. The second 
      // parameter is the successful result. 
      callback(null, token); 
     } 
    }); 
}; 

// Example usage: 
generateUniqueToken((err, token) => { 
    if (err) { 
     res.status(500).send(err); 
    } else { 
     // Use the token here. 
    } 
}); 
+0

tnx您的答案...但1%,如果2令牌得到相等...?! –

+0

是,1%的機會,如果你產生2.6百萬的三次方令牌。地球上只有75億人。 – smarx

+0

對於一個小的角度來看,如果你創建了一個UUID爲地球上每一個人,你找到一個碰撞的機率將大致0.0000000000000000000 << 200,000這裏>> 0000001零。它更可能是你會被流星在明年比你會發現一個衝撞被命中兩次。 – smarx