问题 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)) {
但有几点要记住,
- 不要使用宽松的比较器,
!=
使用严格的比较器 !==
或 ===
- 避免使用 var,它们有时会引起麻烦。
我已经为我的 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)) {
但有几点要记住,
- 不要使用宽松的比较器,
!=
使用严格的比较器!==
或===
- 避免使用 var,它们有时会引起麻烦。