2017-02-22 39 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

如果我回答了您的问题,请将我的答案标记为正确 –