socket.io 中处理回调的正确方法

the correct way of handling callback in socket.io

本文关键字:方法 回调 io 处理 socket      更新时间:2023-09-26

免责声明:我对 Node 完全陌生.js Socket.io 这更像是一个 Javascript/通用编程问题,而不是 Node.js 特定问题,但由于它是用 Node 编写的.js我不得不在这里发布它。

我有这样的函数

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 执行回调并发回令牌。

我的问题是,代码对我来说看起来不整洁,我确信有一种方法可以修改此代码,以便不会多次编写回调,但我不知道为什么。

我想以更专业的方式重写代码。有什么建议吗?

这里不需要任何特殊的异步流帮助程序,只需正确格式化代码即可。但是你可以看看Q promise助手,Async.js和PubSubJS。

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