2016-06-28 21 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

2つの答え:

まず、あなたのUUIDが一意であることを確認するためにデータベースをチェックする必要はありません。 UUIDは非常に大きく、数学的には衝突に遭遇しません。 Are GUID collisions possible?

第2に、あなたがしようとしていることをするには、関数を非同期にしてコールバックで結果を渡す必要があります。例えば。

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 ... 2トークンが等しい場合は1%...?! –

+0

はい、2.6クォンリオンのトークンを生成すると1%の確率です。地球には75億人しかいません。 – smarx

+0

小さな視点では、地球上のすべての人物のUUIDを作成した場合、衝突を見つける確率は約0.0000000000000000000 << 200,000、ここでは0 >> 0000001となります。あなたが衝突を見つけるよりも、次の年に2回流星に当たる確率が高くなります。 – smarx

関連する問題