node.js Массив Json - PullRequest
       4

node.js Массив Json

0 голосов
/ 01 мая 2020

Существует массив JSON. После декодирования этих JSON данных я хочу снова сохранить их как JSON и отправить данные. Но я не знаю, как правильно отправить данные. Пожалуйста, используйте для и пообещайте найти ответ.

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

1 Ответ

0 голосов
/ 01 мая 2020

Проблема в этом фрагменте

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

не гарантируется после инициализации массива со всеми для l oop данные, потому что они обрабатываются здесь асинхронно.

Вы можете переместить эту строку к последнему обещанию, добавив элемент в ваш массив следующим образом:

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
}

Таким образом, вы гарантируете, что сообщение отправляется с последним разрешенным обещанием.

Другой способ - определить обещание, указывающее окончание sh заполнения массива, чтобы вы могли продолжить выполнение кода, пока это обещание разрешается, а затем немедленно отправляет сообщение , Определив

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){})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...