2017-02-22 36 views
0

我的驗證令牌函數返回undefined而不是true,issuetoken函數發出令牌,驗證令牌函數驗證發出的令牌。我的函數返回undefined,我該如何解決

var jwt = require('jsonwebtoken'); //import the jwt mmodule 
var secret = process.env.JWT_SECRET || "david"; // secret question 

//issue token function 
issuetoken = function (username) { 
    var token = jwt.sign({ 
    username, 
    exp: Math.floor(Date.now()/1000) + (60 * 60), 
    }, secret); 

    return token; 
} 

//this function verifies the token, it return true if verification is succesfull and return false if not successfull    
verifytoken = function (token, secret) { 
    jwt.verify(token, secret, function (err, vt) {  
    if (err) { 
     console.log(err); 
     return false; 
    }  
    else { 
     return true;  
    } 
    }); 
} 

var token = issuetoken("david");// issue the token with username david 
var a = verifytoken(token, secret); //verification of token 
console.log(a); //it returns undefined instead of true 
+0

可能重複[如何從異步調用返回響應?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an -asynchronous-call) – Frxstrem

回答

1

jwt.verify是異步的,但你是在同步處理它。

如果你想知道什麼時候該令牌驗證你需要通過某種回調或可能返回Promise

回調

verifytoken = function (token, secret, callback) { 
    jwt.verify(token, secret, function (err, vt) {  
    if (err) { 
     // decide what to do with the error... 
     callback(false); 
    }  
    else { 
     callback(true);  
    } 
    }); 
} 

var token = issuetoken("david"); //"issues the token with username david" 
verifytoken(token, secret, console.log);// verifies the token and prints to the console when done. 

無極

verifytoken = function (token, secret) { 
    return new Promise(function(resolve, reject) { 
    jwt.verify(token, secret, function (err, vt) { 
     if (err) { 
     // decide what to do with the error... 
     reject(false); 
     }  
     else { 
     resolve(true);  
     } 
    }) 
    }) 
} 

var token = issuetoken("david"); //"issues the token with username david" 
verifytoken(token, secret) // verifies the token 
    .then(console.log)  // prints to the console when done. 
    .error(console.error) // prints errors 

如果jwt.verify已經返回承諾,您可以返回結果

編輯

我看了一下jwt文檔,你可以同步。你必須省略回調。

verifytoken = function (token, secret) { 
    try { 
    jwt.verify(token, secret) 
    return true 
    } catch(err) { 
    return false 
    }  
} 
+0

我希望它在驗證令牌時返回true,否則返回false。 – linux

+0

@linux檢查更新後的答案 –

+0

如果我回答了您的問題,請將我的答案標記爲正確 –