2016-05-05 55 views
2

我有一個從MySQL數據庫中選擇用戶名的函數,並返回結果POST請求如下:令牌不創建的NodeJS

function userAuthentication(user){ 
var deferred = Q.defer(); 
pool.getConnection(function(err, connection) { 
    if (err) { 
     var dbError = new Error('No db connection'); 
     console.log(dbError); 
    } 
    else { 
     var selectUserName = 'SELECT * FROM User WHERE username= '+connection.escape(user)+' '; 

     connection.query(selectUserName, function(error, rows){ 
      if(error){ 
       console.log(error); 
       deferred.reject(error); 
      } 
      else if(rows.length === 0){ 
       var countError = new Error('No User Found'); 
       console.log ("Database.js -> "+ countError); 
       deferred.reject(countError); 
      }else{ 
       deferred.resolve(rows); 
      } 
     }); 
    } 
    connection.release(); 
}); 
return deferred.promise; 

}

功能userAuthentication從rout.post叫要求

router.post('/checkAuthentication', function(request, response) { 

    database.userAuthentication(request.body.username).then(function(data) { 
     if(data[0].RowDataPacket!=0){ 
      if(bcrypt.compareSync(request.body.password,data[0].password)){ 
       var token = jwt.sign({ 
        username: data[0].username, 
       }, superSecret,{ 
        expiresInMinutes: 1440 
       }); 

       console.log(token); 
       // return the information including token as JSON 
       response.json({ 
        success: true, 
        message: 'Token Created', 
        token: token 
       }); 
      } 
      else{ 
       response.json({ success: false, message: 'Authentication failed. Wrong Password.' }); 
      } 
     }else{ 
      response.json({ success: false, message: 'Authentication failed. User not found.' }); 
     }  
    }); 
}); 

我想創建一個令牌,當我檢查inputed用戶名和密碼MySQLdb的的那些比賽,但不幸的是令牌不創建;行console.log(token)不會將任何結果輸出到控制檯。什麼是我失蹤的部分?我感謝你的幫助。

+0

你說「行'console.log(令牌)'不打印任何結果到控制檯中」:究竟是什麼意思? console.log語句甚至沒有執行?如果是,它是否打印一個空字符串,null,undefined ...? – MarcoS

+0

@MarcoSü我把var標記當作一個變量..如何在控制檯中檢查標記是否被創建?因爲即使是下一行,response.json也不會抓取? –

+0

'console.log(token)'語句是否被執行?如果是,它究竟打印什麼? – MarcoS

回答

1

您使用哪個jwt節點模塊?
我想這是不是node-jsonwebtoken,因爲它不支持expiresInMinutes,但只有expiresInMinutes ...

然而,你應該括在try/catch塊jwt.sign()號召,抓住它拋出任何錯誤... :

try { 
    var token = jwt.sign(
    { 
     username: data[0].username, 
    }, 
    superSecret, 
    { 
     expiresIn: 1440 * 60, 
    } 
); 
} catch(err) { 
    console.error('error signing json web token:', err); 
} 
+0

var jwt = require('jsonwebtoken')this one,jsonwebtoken –

+0

請參閱我更新的答案:嘗試使用try/catch塊,並使用'expiresIn',而不是'expiresInMinutes' ... – MarcoS

+0

嗯,wierd,現在它抱怨superSecret沒有定義.. –