简体   繁体   English

JavaScript函数在应该返回true的地方返回false

[英]Javascript function is returning false where it should be returning true

I wrote a node.js module. 我写了一个node.js模块。 My module has an isValid method which reads data from a database using a giving token as a lookup value. 我的模块有一个isValid方法,该方法使用给定令牌作为查找值从数据库读取数据。 If the data is valid setData method is called, then return true if the data is valid or false otherwise. 如果数据有效,则调用setData方法,如果数据有效,则返回true,否则返回false。

Based on some messages I logged to the console, the function should return true but when I do `if...else...`` check, it always returns false. 根据我登录到控制台的一些消息,该函数应该返回true,但是当我执行if ... else ...检查时,它总是返回false。

Here is my module 这是我的模块

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;

Here is how I call the module 这是我如何称呼模块

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;

The console prints 控制台打印

Good - return true!
No Go!

I am expecting this for my output 我期望这是我的输出

Good - return true!
Worked!

Why this function is always returning false? 为什么此函数总是返回false?

If you need to see my dbconnect module, here is it's code 如果您需要查看我的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);
    });
}

EDITED EDITED

the current output is actually 当前的输出实际上是

No Go!
Good - return true!

The DB access itself is asynchronous. 数据库访问本身是异步的。

What actually happens is that isValid returns undefined (falsey, but not explicitly false ) so the conditional indicates invalidity. 实际发生的是isValid返回undefined (false,但不是显式false ),因此条件表示无效。

It often makes sense to use === and check for type as well as truthy/falsey: it might have helped indicate why/where the code wasn't doing what you expected. 通常使用===并检查类型以及是否为真/不正确是很有意义的:它可能有助于指出为什么/何地代码没有按照您的预期做。

As indicated in the comments, using callbacks or promises is the canonical approach. 如评论中所述,使用回调或Promise是规范方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM