Javascript函数在应该返回真值的地方返回了假
Javascript function is returning false where it should be returning true
我写了一个node.js模块。我的模块有一个isValid
方法,它使用给定令牌作为查找值从数据库读取数据。如果数据有效,则调用setData方法,如果数据有效则返回true,否则返回false。
根据我记录到控制台的一些消息,函数应该返回true,但是当我做' if…else…' '检查,它总是返回false。
这是我的模块
var db = require('./dbconnect');
var PHPUnserialize = require('php-unserialize');
function validator (){
this.icws = null;
};
/**
* @setData
*
* Set the value of the icwsData
*
* @return void
*/
validator.prototype.setData = function (icws){
this.icws = icws;
};
/**
* @getData
*
* Get the value of the icwsData
*
* @return object
*/
validator.prototype.getData = function (){
return this.icws;
};
/**
* @isValid
*
* Checks if a token is valid or not
*
* @params (string) tokenId: the PHP sessionId
* @params (string) myIP: the user IP address
* @params (integer) duration: the duration to keep the session good for in microseconds
*
* @return bool
*/
validator.prototype.isValid = function (tokenId, myIP, duration){
if(!tokenId || !myIP){
console.log('Missing TokenID or IP Address');
return false;
}
if(!duration){
duration = 3600;
}
var self = this;
db.sqlConnection('SELECT ' +
' su.icws_username AS username ' +
', su.icws_password AS password ' +
', su.icws_workstation AS workstation ' +
', icws.host ' +
', icws.port ' +
', s.data ' +
'FROM sessions AS s ' +
'INNER JOIN view_users AS su ON su.user_id = s.user_id ' +
'INNER JOIN icws_servers AS icws ON icws.server_id = su.icws_server_id ' +
'WHERE s.session_id = ? '
, [tokenId] , function(err, rows){
if(err){
console.log(err);
return false;
}
if(!rows[0] || !rows[0].data){
console.log('No match found for this token!');
return true;
}
var data = PHPUnserialize.unserializeSession(rows[0].data);
var now = Math.floor(new Date() / 1000);
if(!data.MA_IDLE_TIMEOUT || (data.MA_IDLE_TIMEOUT + duration) < now){
console.log('The session Times out!');
return false;
}
if(!data.MA_IP_ADDRESS || myIP != data.MA_IP_ADDRESS){
console.log('This session have been hijacked!');
return false;
}
self.setData(rows[0]);
console.log('Good - return true!');
return true;
});
};
module.exports = validator;
下面是我如何调用模块
var sessionValidator = require('./modules/validator.js');
var sessionChecker = new sessionValidator();
var boo = sessionChecker.isValid(decodedToken, myIP, env.session.duration);
if(boo){
console.log('Worked!');
} else {
console.log('No Go!');
}
return;
控制台打印
Good - return true!
No Go!
我期待我的输出
Good - return true!
Worked!
为什么这个函数总是返回false?
如果你需要看到我的dbconnect模块,这里是它的代码
// Dependencies
var mysql = require('mysql'),
env = require('./config');
/**
* @sqlConnection
* Creates the connection, makes the query and close it to avoid concurrency conflicts.
*
* @param (string) sql: the sql query
* @param (array) values: contains values to sanitize for the query
* @param (function) next: call back function that will have data set if a select query is passed
*
* @return void
*/
exports.sqlConnection = function (sql, values, next) {
// It means that the values hasnt been passed
if (arguments.length === 2) {
next = values;
values = null;
}
var connection = mysql.createConnection({
host: env.mysql.host,
user: env.mysql.user,
password: env.mysql.password,
database: env.mysql.database
});
connection.connect(function(err) {
if (err !== null) {
console.log("[MYSQL] Error connecting to mysql:" + err );
}
});
connection.query(sql, values, function(err) {
connection.end(); // close the connection
if (err) {
throw err;
}
// Execute the callback
next.apply(this, arguments);
});
}
编辑当前输出实际上是
No Go!
Good - return true!
数据库访问本身是异步的。
实际发生的是isValid
返回undefined
(false,但不显式地返回false
),因此条件表示无效。
通常使用===
并检查类型以及true/false是有意义的:它可能有助于指出代码没有按照您的期望工作的原因/位置。
如注释所示,使用回调或承诺是规范的方法。
相关文章:
- 从承诺返回不返回函数会导致警告
- 挂起的回调:在每次回调返回之前返回响应
- 为什么函数 f 中的返回值返回显示函数而不是 x 值
- 函数的返回值返回错误的值
- 返回浏览器-返回链接位置
- 模块中的返回值返回Null
- 返回不返回对象
- 如何防止用户右键单击返回按钮返回
- 在javaScript中返回这个|返回false
- 为什么console.log("text")只返回"text"返回单行
- 在闭包内返回函数返回undefined
- 我可以在if语句中返回后返回吗?Javascript
- 返回逻辑运算符(&&)返回,||返回)
- Javascript返回函数返回undefined
- 想要的文档.打开可创建新的历史元素,返回可返回到原始页面
- 浏览器返回按钮返回遵循自定义url列表
- 在我通过返回键返回页面后,索引没有重置为0
- 一个函数,它接受一个参数并返回一个返回该参数的函数
- 在我自己的Angular服务中,如何将返回值返回给调用该服务的控制器
- 从 jConfirm 对话框向调用方返回值