所以我试图让我的第一个正确的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);
我需要能够将它存储在变量中,以便将其传递给我的渲染函数并将其传递给模板。
任何帮助&指导将不胜感激。
答案 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);
根据您的计划,有一些方法,但通常这是您最好的方法。