2013-10-11 65 views
0

聲明:我對Node.js和Socket.io完全陌生,這更像是一個Javascript /一般編程問題,而不是Node.js的特定問題,但是因爲它是用Node.js編寫,我不得不在這裏發佈。在socket.io中處理回調的正確方法

我有這樣

configs.socket.on('device_pair_authorization', function(device, callback) { 
    var pair_token = device.pair_token; 
    var server_signature = device.server_signature; 
    if(pair_token && server_signature) { 
     var decipher = crypto.createDecipher('aes-256-cbc', 'SOME_KEY'); 
     var decryptedSignature = decipher.update(server_signature, 'base64', 'utf8'); 
     decryptedSignature = decryptedSignature + decipher.final('utf8'); 
     deSigJSON = JSON.parse(decryptedSignature); 
     if(deSigJSON.user_id && deSigJSON.pair_token) { 
      if(deSigJSON.pair_token === pair_token) { 
       var server_handshake_token = deSigJSON.server_token; 
       if(server_handshake_token) { 
        //VALIDATED 
        var one_time_access_token = crypto.createHash('sha512').update([Math.random(), server_handshake_token, new Date()].join()).digest('base64'); 
        var expires = new Date().getTime() + 60; 
        callback({ 
         is_authorized: true, 
         one_time_access_token: one_time_access_token 
        }); 
       } 
       callback({ 
        is_authorized: false, 
        error: "Server Token Is Missing" 
       }); 
      } 
      callback({ 
       is_authorized: false, 
       error: "Pair Token is Incorrect" 
      }); 
     } 
     callback({ 
      is_authorized: false, 
      error: "Signature is corrupted" 
     }); 
    } 
    callback({ 
     is_authorized: false, 
     error: "Pair_Token or Server_Signature is missing" 
    }); 
}); 

功能的整體思路是,該功能是授權功能,防止欺詐行爲,每一個步驟分別檢查,如果出現錯誤的檢查中間,回調會執行一個特定的錯誤消息,並且is_authorized = false。如果一切順利,回調將執行is_authorized = true併發回令牌。

我的問題是,代碼看起來並不整齊,我確信有一種方法來修改此代碼,以便回調不會被多次寫入,但我不知道爲什麼。

我想以更專業的方式重新編寫代碼。有什麼建議麼?

回答

1

這裏不需要任何特殊的異步流助手,只需正確格式化你的代碼即可。但你可以看看Q promises helpers,Async.jsPubSubJS

configs.socket.on('device_pair_authorization', function(device, callback) { 
    var pair_token = device.pair_token; 
    var server_signature = device.server_signature; 
    var errorCallback = function(error) { 
     callback({ 
      is_authorized: false, 
      error: error 
     }); 
    } 

    if(!pair_token || !server_signature) { 
     return errorCallback("Pair_Token or Server_Signature is missing") 
    } 

    var decipher = crypto.createDecipher('aes-256-cbc', 'SOME_KEY'); 
    var decryptedSignature = decipher.update(server_signature, 'base64', 'utf8'); 

    decryptedSignature = decryptedSignature + decipher.final('utf8'); 
    deSigJSON = JSON.parse(decryptedSignature); 

    if(!deSigJSON.user_id || !deSigJSON.pair_token) { 
     return errorCallback("Signature is corrupted"); 
    } 

    if(deSigJSON.pair_token !== pair_token) { 
     return errorCallback("Pair Token is Incorrect"); 
    } 

    if(!deSigJSON.server_token) { 
     return errorCallback("Server Token Is Missing"); 
    } 

    //VALIDATED 
    var server_handshake_token = deSigJSON.server_token; 
    var one_time_access_token = crypto.createHash('sha512').update([ 
     Math.random(), server_handshake_token, new Date() 
     ].join()).digest('base64'); 

    var expires = new Date().getTime() + 60; 

    callback({ 
     is_authorized: true, 
     one_time_access_token: one_time_access_token 
    }); 
}); 
相關問題