node.js функция обратного вызова - PullRequest
0 голосов
/ 27 апреля 2020

Я хотел бы получить значение результата через функцию обратного вызова "SHA512crypto" и использовать его для значения в client.query. Но как бы я ни старался, я получаю только неопределенное значение. Пожалуйста, дайте решение новичку № js.

var SHA512crypto = function (KeyValue, callback) {
    crypto.randomBytes(64, (err, buf) => {
        crypto.pbkdf2(KeyValue, buf.toString('base64'), 97325, 64, 'sha512', (err, key) => {
            //console.log(key.toString('base64'));

            callback(err, key.toString('base64'));
            return;
        });
    });
}

// Socket SignUp Data
var socketSignUp = function (SignUpData, callback) {
    var SignUpSQL = 'insert into userinfo values($1, $2, $3, $4, $5, $6, $7, $8)';
    var companyInfoSQL ='update companyinfo set address = $1, company_number = $2, company_phonenumber = $3, Business_license_number = $4 where company_code = $5';
    var companyInfoValues = [SignUpData.address, SignUpData.admin_company_number, SignUpData.admin_phone_number, SignUpData.businessLicense, SignUpData.company_code];
    var LoginInfoSQL = 'insert into logininfo(email, status, company_code) values($1, $2, $3)';
    var LoginInfoValues = [SignUpData.email, "false", SignUpData.company_code];
    var TimeStampNumSQL = 'SELECT timestamp FROM userinfo ORDER BY timestamp DESC LIMIT 1';

    client.query(TimeStampNumSQL, (err, res) => {
        if (res) {
            var SignUpValues = [res.rows[0].timestamp + 1, SignUpData.admin, SHA512crypto(SignUpData.email), SHA512crypto(SignUpData.password), SignUpData.name, SignUpData.company_code, SignUpData.company_number, SignUpData.phone_number];
            client.query(SignUpSQL, SignUpValues);
            if (SignUpData.admin == "admin") {
                client.query(companyInfoSQL, companyInfoValues);
            }
            client.query(LoginInfoSQL, LoginInfoValues);
        }
    });
}

1 Ответ

0 голосов
/ 27 апреля 2020

Я бы порекомендовал преобразовать в обещание, а затем вы можете использовать Promise.all(), чтобы дождаться завершения нескольких асинхронных операций. В действительности, я хотел бы преобразовать все эти обратные вызовы в обещания и много очищать код, но вот модификация с минимальным преобразованием в обещания и некоторой дополнительной обработкой ошибок:

var SHA512crypto = function (KeyValue) {
    return new Promise(function(resolve, reject) {
        crypto.randomBytes(64, (err, buf) => {
            if (err) return reject(err);
            crypto.pbkdf2(KeyValue, buf.toString('base64'), 97325, 64, 'sha512', (err, key) => {
                //console.log(key.toString('base64'));
                if (err) return reject(err);
                resolve(key.toString('base64'))
            });
        });
    });
}

// Socket SignUp Data
var socketSignUp = function (SignUpData, callback) {
    var SignUpSQL = 'insert into userinfo values($1, $2, $3, $4, $5, $6, $7, $8)';
    var companyInfoSQL ='update companyinfo set address = $1, company_number = $2, company_phonenumber = $3, Business_license_number = $4 where company_code = $5';
    var companyInfoValues = [SignUpData.address, SignUpData.admin_company_number, SignUpData.admin_phone_number, SignUpData.businessLicense, SignUpData.company_code];
    var LoginInfoSQL = 'insert into logininfo(email, status, company_code) values($1, $2, $3)';
    var LoginInfoValues = [SignUpData.email, "false", SignUpData.company_code];
    var TimeStampNumSQL = 'SELECT timestamp FROM userinfo ORDER BY timestamp DESC LIMIT 1';

    client.query(TimeStampNumSQL, (err, res) => {
        if (err) {
            callback(err);
            return;
        }
        if (res) {
            Promise.all([SHA512crypto(SignUpData.email), SHA512crypto(SignUpData.password)])
              .then(([emailCrypto, passwordCrypto]) => {
                  var SignUpValues = [res.rows[0].timestamp + 1, SignUpData.admin, emailCrypto, passwordCrypto, SignUpData.name, SignUpData.company_code, SignUpData.company_number, SignUpData.phone_number];
                  client.query(SignUpSQL, SignUpValues);
                  if (SignUpData.admin == "admin") {
                      client.query(companyInfoSQL, companyInfoValues);
                  }
                  client.query(LoginInfoSQL, LoginInfoValues);
              }).catch(callback);
        }
    });
}

Кажется, что вся ваша команда client.query() должна иметь обратные вызовы и обработку ошибок, и кажется, что некоторые из них неправильно упорядочены, чтобы дождаться, пока первая завершит работу sh, прежде чем запускать следующую. Но это отдельные вопросы из вопроса, который вы задали.

...