【问题标题】:Attempting a find operation 5 times in node在节点中尝试查找操作 5 次
【发布时间】:2012-08-27 12:46:11
【问题描述】:

我正在使用“帽子”生成一个令牌。

我正在尝试编写非常偏执的代码。所以,这个想法是系统生成一个 ID,检查它是否已经被占用(查询数据库),如果没有,它会返回它。如果有,再试5次。 5 次后,发生了非常奇怪的事情,应用程序抛出错误。

简短的问题是:如果令牌实际可用,我怎样才能让这段代码依次运行 5 次,并可选择调用传递的回调(请参阅“退出”循环)?

是只尝试一次的代码:

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 );
      }
    }
  });
}

【问题讨论】:

    标签: node.js asynchronous


    【解决方案1】:

    我认为你是偏执狂。你为什么做这个?为什么是 5 次?

    把它放在一边。 您应该做的就是在天气令牌存在与否时询问数据库。 如果您得到结果,则令牌正在使用中,如果没有,则未使用。故事结束。

    正如我在您之前的@​​987654321@ 中提到的,您甚至不需要生成令牌,因为您可以使用 mongodb 的本机 ObjectId 作为您的唯一标识符,假设您为每个“用户”存储一个单独的文档。

    【讨论】:

      【解决方案2】:

      很遗憾,我不能使用 ObjectId,因为 1) 用户可能决定重新生成令牌密钥 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 );
              }
            }
          });
        }
      }
      

      【讨论】:

      • 事实上,在一般的节点和异步编程中,这是否是“循环”的常见模式?
      猜你喜欢
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      相关资源
      最近更新 更多