我正在使用一个函数来检查用户是否已在网站上注册。
但是我不知道如何从函数 selectEmail()
rows
的值
我试图将它存储在 temp
中,但它似乎将它存储在它自己的本地版本中,并且一旦查询部分结束,我就会留下一个空变量。
function checkEmail(email, req, res){
var temp;
dbConnect(req,res);
var query = 'SELECT EMAIL FROM USERS WHERE EMAIL="'+email+'"';
connection.query(query, function selectEmail(err,rows,fields){
if (err) {
throw err;
}
temp=rows;
})
dbClose(req,res);
console.log(temp);
if (temp==""){
console.log('No matching email in database');
return 0;
}
else{
console.log('Duplicate Email detected in database');
return 1;
}
}
我听说我应该使用回调,但我也不知道如何让它工作。
最佳答案
我猜测 connection.query
是异步的,这意味着它在其余代码执行之前不会完成。这意味着当您到达 if(temp==""){
时,temp
没有值。
为了处理这个问题,需要使用回调。回调是代码完成后调用的函数,在本例中为 connection.query()
。这正是您在本例中所拥有的,只是格式不太正确:
connection.query(query, function selectEmail(err,rows,fields){
if (err) {
throw err;
}
temp=rows;
})
这里 selectEmail()
是回调,只不过回调应该以函数指针或匿名函数(没有名称)的形式提供:
connection.query(query, function(err,rows,fields){
if (err) {
throw err;
}
temp=rows;
});
此代码很可能在 checkEmail()
返回后出现。 conection.query()
完成后您希望发生的任何事情都应该在回调中或由回调调用。像这样:
connection.query(query, function(err,rows,fields){
if (err) {
throw err;
}
dbClose(req,res);
if (rows==""){
console.log('No matching email in database');
handleEmailCheckFailure();
}
else{
console.log('Duplicate Email detected in database');
handleEmailCheckSuccess();
}
});
当然,您希望 checkEmail()
根据检查是否成功返回一个值。这不适用于异步调用。您将需要具有处理通过和失败情况的函数(上面的handleEmailCheckFailure
等)。您还需要注意,在调用这两种情况之前,根据连接情况,会花费一些时间。
关于javascript - 从 Node.js 中的嵌套函数中获取变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15119976/