【问题标题】:async function inside sync function dont return value同步函数内的异步函数不返回值
【发布时间】:2015-08-24 06:53:19
【问题描述】:

我正在构建一个使用 linux 密码影子文件检查用户密码的函数。 问题是主(同步)函数在内部异步函数完成之前返回未定义,因此它总是返回未定义。

如何将主函数更改为异步,以便等待异步函数完成?

请指教。 提前问好

阿德里安

  function checkPass(a, b) {
    "use strict";
    var fs = require('fs');
    var sha512crypt = require('sha512crypt-node');
    //
    var shadow = '/tmp/shadow';
    var userNameCheck = a;
    var passwordCheck = b;
    //
    var response;

    fs.readFile(shadow, function (err, logData) {
        if (err) throw err;

        // logData is a Buffer, convert to string.
        var shadowFile = logData.toString();
        var shadowList = shadowFile.split('\n');

        for (var line in shadowList) {
            var userEntree = shadowList[line].split(":");

            if (userEntree[0] === userNameCheck) {

                var username = userEntree[0];
                var fullShadow = userEntree[1];
                //
                var fullShadowSplit = userEntree[1].split('$');
                //
                var passwordAlgorithm = fullShadowSplit[1];
                var saltShadow = fullShadowSplit[2];
                var passwordShadow = fullShadowSplit[3];
                //

                var hash = sha512crypt.sha512crypt(passwordCheck, saltShadow)
                //console.log(hash + '===' + fullShadow);
                if (hash === fullShadow) {
                    console.log('LOG: oldPassCorrect');
                    //return 'oldPassCorrect';
                    response = 'oldPassCorrect';
                    return response;
                    break;
                } else {
                    console.log('LOG: oldPassIncorrect');
                    //return 'oldPassCorrect';
                    response = 'oldPassIncorrect';
                    return response;
                    break;
                }
            }
        }
    });
}


console.log("Function response: " + checkPass('share', 'qwerty'));

【问题讨论】:

标签: javascript node.js


【解决方案1】:

我在主函数中添加了一个回调:

function checkPass(a, b, callback) {
    "use strict";
    var fs = require('fs');
    var sha512crypt = require('sha512crypt-node');
    //
    var shadow = '/tmp/shadow';
    var userNameCheck = a;
    var passwordCheck = b;
    //
    var response;

    fs.readFile(shadow, function (err, logData) {
        if (err) throw err;

        // logData is a Buffer, convert to string.
        var shadowFile = logData.toString();
        var shadowList = shadowFile.split('\n');

        for (var line in shadowList) {
            var userEntree = shadowList[line].split(":");

            if (userEntree[0] === userNameCheck) {

                var username = userEntree[0];
                var fullShadow = userEntree[1];
                //
                var fullShadowSplit = userEntree[1].split('$');
                //
                var passwordAlgorithm = fullShadowSplit[1];
                var saltShadow = fullShadowSplit[2];
                var passwordShadow = fullShadowSplit[3];
                //

                var hash = sha512crypt.sha512crypt(passwordCheck, saltShadow)
                //console.log(hash + '===' + fullShadow);
                if (hash === fullShadow) {
                    console.log('LOG: oldPassCorrect');
                    response = 'oldPassCorrect';
                    callback(response);
                    break;
                } else {
                    console.log('LOG: oldPassIncorrect');
                    response = 'oldPassIncorrect';
                    callback(response);
                    break;
                }
            }
        }
    });
}


checkPass('share', 'qwerty', function (response) {
        console.log("CallBack: " + response);
    });

【讨论】:

  • 这不仅是正确的方法,而且是唯一的方法。你可以对 Promise 更感兴趣,但它仍然是基于回调的。
  • 其实还有一点需要补充。让回调接受两个参数,err 和 result 是节点的标准。所以不是if (err) throw err;if (err) return callback(err);而不是callback(response);callback(null, response)
  • 感谢大家的帮助
猜你喜欢
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 2022-01-14
  • 2019-02-27
  • 2021-07-16
相关资源
最近更新 更多