数据库查询的callback函数什么也没有返回

所以我这样做:

module.exports.checkEmailInUse = (email) => { connection.query('SELECT `id` FROM `users` WHERE email = ?', [ email ], function(err, rows, fields) { console.log(rows.length); if(rows.length > 0){ return true; } else{ return false; } } ); } 

这个表是空白的。 我得到0返回,因为它应该。 但在这个其他的文件中,我这样做:

 if(Database.checkEmailInUse(email)){ callback({success: "false", message: "Email Already In Use"}); return false; } 

这不应该触发,因为这将返回0 ….但它。

但是现在,如果我把它们像string一样返回,

 return "true"; 

和:

 if(Database.checkEmailInUse(email) == "true") 

它会工作。

这是我与NodeJS的第一个项目,我很难过。

编辑答案。 谢谢qqilihq! :

 module.exports.checkEmailInUse = (email) => { var queryTheEmail = (email, callback)=>{ connection.query('SELECT `id` FROM `users` WHERE email = ?', [ email ], function(err, rows) { if (err) { callback(err,null); } else{ callback(null,rows); } } ); } queryTheEmail(email, (err, rows) => { if (err) { console.error('SQL error: ', err); return false; } if(rows.length > 0){ return true; } else{ return false; } }); } 

问题是,你的checkEmailInUse函数实际上什么都没有返回。 数据库查询asynchronous发生:检查函数的嵌套。 作为一个(简化的)经验法则: asynchronous是病毒式的 – 只要你的代码包含asynchronous部分,所有利用它的东西都需要处理asynchronous性。

你需要重构这个,使用callback或者返回promise。 下面的例子展示了如何使用callback(以及一些额外的代码清理)来完成它:

 module.exports.checkEmailInUse = (email, callback) => { connection.query('SELECT `id` FROM `users` WHERE email = ?', [ email ], function(err, rows, fields) { if (err) return callback(err); callback(null, rows.length > 0); } ); } 

然后,使用checkEmailInUse函数如下:

 Database.checkEmailInUse(email, function(err, exists) { if (err) { return callback({success: "false", message: "Error when checking the DB"}); } if (exists) { callback({success: "false", message: "Email Already In Use"}); } else { callback({success: "true", message: "Come in!"}); } }); 

有一次,你对asynchronous概念很熟悉,而且你的代码库也在增长,为了避免所谓的“callback地狱”,并且让你的代码更加可读(或者使用async.js等助手),值得考虑引入promise, 。

无论哪种方式,这与布尔人无关,特别是作为原始问题的标题。