Node.js返回值未定义

时间:2018-06-23 16:08:16

标签: node.js ecmascript-6

以下代码段中的

token始终为undefined。有人可以帮我弄清楚这里出什么问题吗?

[err, token] = await to(comparePassHash(body.password, user.password));`

comparePassHash = async (pass, hash) => {
    bcrypt.compare(pass, hash, (err, token) => {
        if (err) TE(err);
        console.log('test');
        return token;
    });
};


to = (promise) => {
    return promise
    .then(data => {
        return [null, data];
    }).catch(err =>
        [pe(err)]
    );
};

1 个答案:

答案 0 :(得分:0)

之所以undefined是因为comparePassHash要解决的问题。

在这种情况下,

async关键字将无法正常运行。您将在token函数内部而不是.compare内部返回comparePassHash。您必须用bcrypt.compare包装Promise

const comparePassHash = (pass, hash) => {
    return new Promise((resolve, reject) => {
        bcrypt.compare(pass, hash, (err, token) => {
            if (err) 
                return reject(err);
            console.log('test');
            return resolve(token);
        });
    });
};

执行您的功能:

comparePassHash = async (pass, hash) => {
    bcrypt.compare(pass, hash, (err, token) => {
        if (err) TE(err);
        console.log('test');
        return token;
    });

   // implicit return: undefined
};

如果没有await,它将执行bcrypt.compare,因为它不是一个承诺,它不会等到完成,它会退出该函数,并返回undefined,因为缺少return语句。

另一种方法是使用Util.promisify

const { promisify } = require('util');
const comparePassHash= promisify(bcrypt.compare);

// This must be inside an async function
[err, token] = await to(comparePassHash(body.password, user.password));