NodeJS存储模块功能结果

时间:2017-06-14 19:48:05

标签: javascript node.js express

所以我试图让我的第一个正确的NodeJS项目使用双因素身份验证,我正在学习并习惯Node。

我有这个函数从data_url返回正确的值但是当我把它放在一个变量中并返回data_url时它会以'undefined'的形式返回

什么有效:

QRCode.toDataURL(user.tempSecret.otpauth_url, function (err, data_url) {
    console.log(data_url);
});

什么行不通:

let thisQR = QRCode.toDataURL(user.tempSecret.otpauth_url, function (err, data_url) {
    return data_url;
});

console.log(thisQR);

我需要能够将它存储在变量中,以便将其传递给我的渲染函数并将其传递给模板。

任何帮助&指导将不胜感激。

1 个答案:

答案 0 :(得分:3)

我将假设QRCode.toDataURL不是异步的。基于这个假设,您的问题是范围。您将data_url返回到匿名函数而不是QRCode.toDataURL。

再说一次,假设这不是一个异步函数,这对你有用:

    let thisQR;
    QRCode.toDataURL(user.tempSecret.otpauth_url, function (err, data_url) {
        thisQR = data_url;
    });

如果这不起作用,那么你正在处理一个异步函数。在这种情况下,你的问题是你在函数处理完请求之前尝试console.log“thisQR”。此链接将帮助您了解异步编程以及您正在做的错误。 https://blog.risingstack.com/node-hero-async-programming-in-node-js/

=============================================== ============================

编辑以通过OP解决评论:

function (err, data_url) {
            thisQR = data_url;
        });

以上是你的回调函数。目前它是一个匿名函数(它没有名称),但我们可以给它一个名字,然后根据需要对data_url做一些事情。像这样:

function doSomethingWithQRCode(err, data_url){
    console.log(data_url);
}

QRCode.toDataURL(user.tempSecret.otpauth_url, doSomethingWithQRCode);

使用异步回调函数返回的值仅限于函数范围。因此,如果要使用这些值,则必须在回调函数内使用这些值调用函数:

function doSomethingWithQRCode(err, data_url){
    useQRCode(data_url)
}

QRCode.toDataURL(user.tempSecret.otpauth_url, doSomethingWithQRCode);

根据您的计划,有一些方法,但通常这是您最好的方法。