2017-06-14 68 views
0

所以我試圖得到雙因素身份驗證與我正在使用的第一個適當的NodeJS項目,學習和習慣節點。NodeJS存儲模塊功能結果

我有回報這個功能從data_url正確的價值觀但是當我把它放在一個變量,並返回data_url它回來爲「未定義」

什麼工作:

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

什麼沒有按」 t工作:

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

console.log(thisQR); 

我需要能夠將其存儲在一個變量,所以我可以將它傳遞到我的渲染功能,並通過它直到模板。

任何幫助&指導將不勝感激。

回答

2

我打算假定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); 

有根據程序解決此某些方面,但通常這是你的最好的方法。

+0

非常感謝答覆和說明/鏈接。 據我瞭解,我需要做一個回調函數來獲得結果,當它準備好了嗎? 我可以做'thisFunction(thisCallback);'通常,但事實上它是一個模塊的函數(QRCode.toDataURL)使用裏面的函數混淆了我。 –

+0

我已經更新了我的答案,希望能夠解決您的評論。 – jonode

+0

上面編輯的代碼片段的工作達到了他們打印完全控制的程度,儘管它第一次註銷時它是'未定義',這可能是我實際嘗試實現的問題? 我想返回的結果將保存在以下對象,因此它可以在我的模板打印出來EJS文件 'res.render(「twoFactor」,{ 標題:「twoFactor」, 形象:codeToGetURL });' 你如何將異步函數中的返回數據傳遞給JavaScript對象,而不傳遞它首先給出的'undefined'值? –