所以我这样做:
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 ....但确实如此。
但现在如果我将它们作为字符串返回:
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;
}
});
}
答案 0 :(得分:2)
问题是,您的checkEmailInUse
函数实际上返回 nothing 。数据库查询异步发生:检查函数的嵌套。作为(简化)经验法则:异步是病毒 - 只要您的代码包含异步部分,利用它的所有内容都需要处理异步。
您需要重构此操作,以使用回调或返回承诺。以下示例显示了如何使用回调(以及一些额外的代码清理)来执行此操作:
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!"});
}
});
有一次,您对异步概念越来越熟悉并且您的代码库不断增长,为了避免所谓的“回调地狱”,我们值得考虑引入承诺。并使您的代码更具可读性(或使用async.js等帮助程序)。
无论哪种方式,这都与布尔无关,特别是原始问题标题假设。