【问题标题】:node.js Array Jsonnode.js 数组 Json
【发布时间】:2020-08-15 16:01:45
【问题描述】:

有一个 JSON 数组。解码此 JSON 数据后,我想再次将其保存为 JSON 并发送数据。但我不知道如何正确发送数据。请使用 for 并承诺找到答案。

var AES256cryto = function (KeyValue) {
    return new Promise(function (resolve, reject) {
        var encrypt = ((val) => {
            let cipher = crypto.createCipheriv('aes-256-cbc', ENC_KEY, IV);
            let encrypted = cipher.update(val, 'utf8', 'base64');
            encrypted += cipher.final('base64');

            return encrypted;
        });

        //if (err) return reject(err);
        resolve(encrypt(KeyValue));
    });
}

var AES256decrypt = function (KeyValue) {
    return new Promise(function (resolve, reject) {
        var decrypt = ((encrypted) => {
            let decipher = crypto.createDecipheriv('aes-256-cbc', ENC_KEY, IV);
            let decrypted = decipher.update(encrypted, 'base64', 'utf8');

            return (decrypted + decipher.final('utf8'));
        });

        resolve(decrypt(KeyValue));
    });
}

 

if (rows) {
        var userinfoArray = new Array();

        for (var i = 0; i < rows.rows.length; i++) {
            Promise.all([AES256decrypt(rows.rows[i].admin), AES256decrypt(rows.rows[i].email), AES256decrypt(rows.rows[i].name)])
                .then(([adminDecrypt, emailDecrypt, nameDecrypt]) => {
                    var userinfo = new Object();

                    userinfo.admin = adminDecrypt;
                    userinfo.email = emailDecrypt;
                    userinfo.name = nameDecrypt;

                    userinfoArray.push(userinfo);
                }).catch(callback);


        }

    socket.emit('UserDataOK', userinfoArray);
    }

【问题讨论】:

    标签: node.js json promise socket.io


    【解决方案1】:

    你在这个sn-p中的问题

    var userinfoArray = new Array();
    
    for (var i = 0; i < rows.rows.length; i++) {
        Promise.all([AES256decrypt(rows.rows[i].admin), AES256decrypt(rows.rows[i].email), AES256decrypt(rows.rows[i].name)])
            .then(([adminDecrypt, emailDecrypt, nameDecrypt]) => {
                var userinfo = new Object();
    
                userinfo.admin = adminDecrypt;
                userinfo.email = emailDecrypt;
                userinfo.name = nameDecrypt;
    
                userinfoArray.push(userinfo);
            }).catch(callback);
    
    
    }
    
    socket.emit('UserDataOK', userinfoArray);
    

    是这样的说法

    socket.emit('UserDataOK', userinfoArray);
    

    由于这里是异步处理的,所以不保证在数组用所有for循环数据初始化后执行。

    您可以将这一行移到最后一个承诺,向您的数组添加一个元素,如下所示:

    var userinfoArray = new Array();
    let expected_array_length = rows.rows.length;
    
    for (var i = 0; i < rows.rows.length; i++) {
        Promise.all([AES256decrypt(rows.rows[i].admin), AES256decrypt(rows.rows[i].email), AES256decrypt(rows.rows[i].name)])
            .then(([adminDecrypt, emailDecrypt, nameDecrypt]) => {
                var userinfo = new Object();
    
                userinfo.admin = adminDecrypt;
                userinfo.email = emailDecrypt;
                userinfo.name = nameDecrypt;
    
                userinfoArray.push(userinfo);
                if(userinfoArray.length == expected_array_length) {
                    socket.emit('UserDataOK', userinfoArray);
                }
            }).catch(function(err){expected_array_length -= 1; callback(err)}); // decrease rows.rows.length on your callback for each failing insert
    }
    

    这样,您将保证在发送消息时最后一个承诺已解决。

    另一种方法是定义一个表示填充数组完成的承诺,以便您可以在此承诺解决时继续运行代码,然后立即发送消息。通过定义

    const fillData = function(){
        var userinfoArray = new Array();
        return new Promise(async function (resolve, reject) {
            for (var i = 0; i < rows.rows.length; i++) {
                try{
                [adminDecrypt, emailDecrypt, nameDecrypt] = await Promise.all([AES256decrypt(rows.rows[i].admin), AES256decrypt(rows.rows[i].email), AES256decrypt(rows.rows[i].name)])
                var userinfo = new Object();
    
                userinfo.admin = adminDecrypt;
                userinfo.email = emailDecrypt;
                userinfo.name = nameDecrypt;
    
                userinfoArray.push(userinfo);
                } catch(err){
                    callback(err)
                }
            }
            resolve(userinfoArray)
        })
    }
    

    你可以这样调用它来发送关于承诺解决的消息

    fillData(rows)
    .then(function(userinfoArray){
        socket.emit('UserDataOK', userinfoArray);
    }, function(err){})
    

    【讨论】:

    • 谢谢。多亏了你,我才能完美地解决长期存在的问题。并感谢您提出我错误的智慧和更好的方法。
    猜你喜欢
    • 2012-08-08
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2015-03-05
    • 1970-01-01
    • 2018-04-23
    相关资源
    最近更新 更多