0

「帽子」を使ってトークンを生成しています。

私は非常に偏執的なコードを書き込もうとしています。つまり、システムはIDを生成し、それがすでに取得されているかどうかをチェックし(DBにクエリを実行)、取得されていない場合はIDを返します。ある場合は、5回再試行します。5回経過すると、非常に奇妙なことが起こり、アプリケーションはエラーをスローします。

簡単な質問は、トークンが実際に利用可能である場合に、渡されたコールバックを呼び出すオプション(サイクルの「終了」を参照)を使用して、このコードを順番に5回実行するにはどうすればよいですか?

これは、1回だけ試行するコードです。

var hat = require('hat'),
mongoose = require('mongoose');

exports.makeToken = function( callback ){

  Workspace = mongoose.model("Workspace");

  var found = false;
  var token;

  // Generate the token, check that it's indeed available
  token = hat();
  Workspace.findOne( { 'access.token':token } , function(err, doc){
    if(err){
      callback(err, null);
    } else {
      if( doc ){
        callback( new Error("Cannot generate unique token"), null );
      } else {
        callback(null, token );
      }
    }
  });
}
4

2 に答える 2

0

あなたは妄想的だと思います。なぜあなたはこれをやっている?なぜ5回?

それを片側に置きます。あなたがしなければならないのは、トークンが存在するかどうかを天気予報でデータベースに尋ねることだけです。結果が得られた場合はトークンが使用されており、そうでない場合は取得されていません。物語の終わり。

前の質問で述べたように、 mongodbのネイティブObjectIdを一意の識別子として使用できるため、トークンを生成する必要はありません。これは、「ユーザー」ごとに個別のドキュメントを保存することを前提としています。

于 2012-08-27T04:35:49.930 に答える
0

残念ながら、1)ユーザーがトークンキーを再生成することを決定する可能性があるため、ObjectIdを使用できません。2)ユーザーは個別のドキュメントとして保存されません。

したがって、生成されたトークンが一意でない可能性があります。これにより、2つのユーザー<->ワークスペースペアに同じトークンIDが存在する状況が発生しますが、これは適切ではありません。したがって、5回の試行。私はチャンスがかなり少ないことを認めますが、それでも...

私はこれを思いついた(ここでは再帰が必要です):

var hat = require('hat'),
mongoose = require('mongoose');

exports.makeToken = function( callback ){

  var attempts = 0;
  look();

  function look(){
    Workspace = mongoose.model("Workspace");

    // Generate the token, check that it's indeed available
    var token = hat();
    Workspace.findOne( { 'access.token':token } , function(err, doc){

      // There is an error: throw it straight away
      if(err){
        callback(err, null);
      } else {

        // Token already there: either give up (too many attempts)...
        if( !doc ){
          attempts ++;
          if( attempts == 5 ){
            callback( new Error("Cannot generate unique token"), null );
          } else {
            look();
          }
        // ... or try again by calling this function again!
        } else {
          callback(null, token );
        }
      }
    });
  }
}
于 2012-08-27T04:46:11.627 に答える