2012-08-27 41 views
0

我正在使用「帽子」生成令牌。嘗試在節點中查找操作5次

我想寫的非常偏執的代碼。所以,這個想法是系統生成一個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); 
     } 
    } 
    }); 
} 

回答

0

不幸的是,我不能使用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); 
     } 
     } 
    }); 
    } 
} 
+0

其實,這是一個「循環」像這樣的一個常見的模式在節點和一般的異步編程? – Merc

0

。你爲什麼做這個?爲什麼5次?

把它放在一邊。 所有你應該做的是要求分貝一旦天氣令牌存在與否。 如果你得到了一個結果,那麼令牌正在使用,如果沒有,那麼採取還沒有被使用。故事結局。

正如我在之前的question中所提到的,您甚至不需要生成令牌,因爲您可以使用mongodb的本地ObjectId作爲唯一標識符,假定您爲每個「用戶」存儲單獨的文檔。