问题 recognizing/comparing 从数据库调用返回的信息

Problem recognizing/comparing information returned from database call

我已经为我的 Node.js 脚本编写了一个 'route protector'。它基本上接受一个名称和一个令牌,并将这些信息与数据库进行比较,以限制对某些 pages/routes 的访问。一切似乎都很好。我的问题是当我尝试 'compare' 来自数据库调用的信息 return 时......它总是 returns 'false' 而它不应该(即来自数据库调用和比对信息匹配)。

我的 'route' 调用 'sessionChecker' 代码:

app.get('/_member_id', csrfProtection, function(req, res){

if (typeof req.session.user != "undefined") {

 if (sessionCheck(req.session.user, req.session.token)) {
 //render to another page 
 } else {
 //route to a login page here
 }  //sessionCheck returned "true"...OR NOT...

} else {
res.render('pages/forbidden'),
console.log("FORBIDDEN ENTRY");
}

});

这里是 'sessionChecker':

function sessionCheck(initiator, keycard, req, res, next) {

var _knocker;
var _init_convert = JSON.stringify(initiator);
var _key_convert = JSON.stringify(keycard);

console.log('initiator in sessionCheck is: ' + initiator);
console.log('keycard in sessionCheck is: ' + keycard);
console.log('_init_convert in sessionCheck is: ' + _init_convert);
console.log('_key_convert in sessionCheck is: ' + _key_convert);

 if (typeof initiator != "undefined") {
 _knocker = "member";
 } else {
 _knocker = "customer";
 }  //'initiator' is NOT "undefined" (indicates a MEMBER)...OR NOT (indicates a CUSTOMER)...

console.log('_knocker in sessionCheck is: ' + _knocker);

  if(typeof keycard != "undefined") {

  db.findByToken(_knocker, keycard)
   .then(function(user) {
console.log('I RETURNED FROM db.findByToken', user);
     if ((JSON.stringify(user.username) == _init_convert) && (JSON.stringify(user.token) == _key_convert)) {
console.log('I will return TRUE');
     return true
     } else {
console.log('I will return FALSE');
     return false
     }
   })
  .catch(function(err) {
  console.log('An ERROR has been thrown in sessionCheck...!', err);
  });

  } else {
  next(new Error('No session token'));
  }  //req.session.token EXTANT

}; 

输出到控制台:

initiator in sessionCheck is: member1
keycard in sessionCheck is: h9Cb-BVJ
_init_convert in sessionCheck is: "member1"
_key_convert in sessionCheck is: "h9Cb-BVJ"
_knocker in sessionCheck is: member
I RETURNED FROM db.findByToken [ { email: 'me@otherhost.com',
username: 'member1',
govname: 'Stephen,S',
birthdate: '5-2-1982',
location: 'Nevada',
service: 'unknown',
status: 'active',
login: '2019-12-21-14-20',
legacy: '2019-12-21',
token: 'h9Cb-BVJ' } ]
I will return FALSE

从输出中可以看出...数据似乎匹配(user.username,user.token 来自数据库调用等于传递给函数的信息)...但是 return 'false' 的值仍然被抛出...为什么?我提前感谢你的任何回应。

所以 db.findByToken returns 一个数组,而不是一个对象。

if ((JSON.stringify(user.username) == _init_convert) && (JSON.stringify(user.token) == _key_convert)) {

将会

if ((JSON.stringify(user[0].username) == _init_convert) && (JSON.stringify(user[0].token) == _key_convert)) {

但有几点要记住,

  1. 不要使用宽松的比较器,!= 使用严格的比较器 !=====
  2. 避免使用 var,它们有时会引起麻烦。