Javascript 数据库查询的回调函数不返回任何内容
所以我这样做:Javascript 数据库查询的回调函数不返回任何内容,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,所以我这样做: module.exports.checkEmailInUse = (email) => { connection.query('SELECT `id` FROM `users` WHERE email = ?', [ email ], function(err, rows, fields) { console.log(rows.length);
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;
}
}
);
}
if(Database.checkEmailInUse(email)){
callback({success: "false", message: "Email Already In Use"});
return false;
}
这张桌子是空的。我得到了应返回的0。但在另一个文件中,我这样做:
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;
}
}
);
}
if(Database.checkEmailInUse(email)){
callback({success: "false", message: "Email Already In Use"});
return false;
}
这不应激发,因为它返回0。。。。但确实如此
但是现在如果我将它们作为字符串返回,比如:
return "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
函数实际上不返回任何内容。DB查询是异步进行的:检查函数的嵌套。作为(简化的)经验法则:异步是病毒式的——只要代码包含异步部分,使用它的一切都需要考虑异步
您需要重构它,以使用回调或返回承诺。下面的示例演示了如何使用回调(以及一些额外的代码清理)完成此操作:
然后,按如下方式使用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之类的帮助程序)
无论哪种方式,这都与布尔无关,特别是与原始问题标题假设的一样。问题是,您的
checkEmailInUse
函数实际上没有返回任何内容。DB查询是异步进行的:检查函数的嵌套。您需要重构它,以使用回调或返回承诺。不管怎样,这都与布尔无关。专业的离题提示:如果你发现自己在返回true或false,那么这可能是不必要的代码。你的if(rows.length>0).
可以被return rows.length>0
@LiamGray替换,这就是我最初拥有的,并且从lol开始就一直在对这个问题进行垃圾射击。@qqilihq我认为函数(err,rows,fields){
是对查询的回调。好的,现在开始研究它。谢谢。是的,但从那时起,您必须保持异步性质。简单地说:只要代码的某些部分包含async.parts,所有内容都将变为异步。@user2287474不客气!我将编辑问题的标题,这可能对mor有所帮助e有类似问题的人。