我有一个客户端将JSON信息发送到服务器并尝试进行注册。 JSON包括此用户的名称和密码。在服务器将注册记录到数据库之前,需要确保用户名可用。为此,我创建了一个名为isRegisted(req)的函数,它在数据库上进行搜索,如果result.length大于零,则将布尔值设置为true,并在函数末尾返回此布尔值。 mysql搜索返回它在“结果”中的预期,但最后没有设置布尔值,并且console.log打印未定义。
这是我的代码:
function register(req , res){
res.setHeader('Content-Type', 'application/json');
console.log(isRegisted(req));
}
function isRegisted(req){
var flag;
var query = conn.query("SELECT * FROM Users WHERE name=?", [ req.body.name ], function(err, result) {
if(err){
console.error(err);
return;
}
console.log(result);
if(result.length > 0)
flag = true;
else
flag = false;
});
return flag;
}
感谢您的关注。
答案 0 :(得分:0)
您的代码的问题是,您向数据库发出异步请求。函数(错误,结果)将仅在数据库中进行查询后执行。因此,当调用函数(错误,结果)时,您无法确定。因此,在大多数情况下,标志始终未定义,因为数据库尚未执行查询,这会导致未定义的变量标志。绕过这个问题,在函数中做另外的逻辑(错误,结果)。
答案 1 :(得分:-2)
在这种情况下,您有一个异步。函数,所以父函数不等待子函数执行并返回undefined。这样的事情可能对你有用:
var successFn = function() {console.log('success');},
errorFn = function() {console.log('error');};
function register(req , res){
res.setHeader('Content-Type', 'application/json');
console.log(isRegisted(req, successFn, errorFn));
}
function isRegisted(req, successFn, errorFn){
var flag;
var query = conn.query("SELECT * FROM Users WHERE name=?", [ req.body.name ], function(err, result) {
if(err){
errorFn();
}
if(result.length > 0) {
successFn();
}
});
}