Javascript函数返回false,它应该返回true

我写了一个node.js模块。 我的模块有一个isValid方法,它使用给定令牌作为查找值从数据库中读取数据。 如果数据是有效的,则调用setData方法,如果数据有效,则返回true,否则返回false。

基于我login到控制台的一些消息,函数应该返回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); }); } 

EDITED

目前的产出实际上是

 No Go! Good - return true! 

数据库访问本身是asynchronous的。

实际发生的是isValid返回undefined (falsey,但不是明确的false ),所以条件表示无效。

使用===和检查types以及truthy / falsey通常是有意义的:它可能有助于说明为什么/哪里的代码没有做你期望的。

正如评论中所指出的,使用callback或承诺是规范的方法。