Проблема распознавания / сравнения информации, возвращаемой из вызова базы данных - PullRequest
0 голосов
/ 22 декабря 2019

Я написал «Защитник маршрута» для моего скрипта Node.js. Он в основном берет имя и токен и сравнивает эту информацию с базой данных, чтобы ограничить доступ к определенным страницам / маршрутам. Кажется, все работает нормально. Моя проблема в том, что когда я пытаюсь «сравнить» информацию, возвращаемую из вызова базы данных ... он всегда возвращает «ложь», когда не должен (т.е. информация из вызова базы данных и информация сравнения сравниваются).

Мой 'маршрут', который вызывает код '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 из базы данных вызывают одинаковую информацию, которая была передана функции) ... однако возвращается значение 'falseвсе еще брошен ... почему? Заранее благодарю за любой ответ.

1 Ответ

0 голосов
/ 22 декабря 2019

Итак, db.findByToken возвращает массив, а не объект.

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, они могут иногда вызывать проблемы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...