以下是我在node.js和node-mysql module.
中执行此操作的代码function registerUser(username, password) {
var state = '';
if (!username) { //line #4
state = 'Missing <strong>username</strong>';
return state;
}
if (!password) { //line #8
state = 'Missing <strong>password</strong>';
return state;
}
function addUser() {
statement = 'INSERT INTO data (user_name, user_password) VALUES (\'' + username + '\', \'' + password + '\');';
connection.query(statement, function(err) {
if (err) throw err;
console.log('User ' + username + ' added to database');
})
}
connection.query('SELECT user_name FROM data WHERE user_name=\'' + username + '\'', function(err, result){
if (err) throw err;
if (!result[0]) {
addUser();
console.log('User ' + username + ' added.');
state = 'Success!';
return;
} else {
console.log('User ' + username + ' already exists.');
state = 'User already exists!';
return;
}
})
return state; //line #33
}
触发第4行和第4行的陈述正在分配#8 state
变量并按预期返回。但是,在connection.query
中的匿名函数中执行的代码未分配state
,而第33行的返回则不返回任何内容。
我不确定变量范围是否存在问题,或者connection.query
是否为非阻塞,并且在#33之前的返回是在匿名函数之前执行的。
有没有办法让这个工作并从匿名函数返回state
?
提前谢谢。
答案 0 :(得分:2)
.query
似乎是异步的,这意味着它可能在执行 return state;
后执行。您需要做的是为registerUser
提供回调参数:
function register_user(username, password, callback) {
if (!username) { //line #4
callback('Missing <strong>username</strong>');
}
if (!password) { //line #8
callback('Missing <strong>password</strong>');
}
function addUser() {
statement = 'INSERT INTO data (user_name, user_password) VALUES (\'' + username + '\', \'' + password + '\');';
connection.query(statement, function(err) {
if (err) throw err;
console.log('User ' + username + ' added to database');
})
}
connection.query('SELECT user_name FROM data WHERE user_name=\'' + username + '\'', function(err, result){
if (err) throw err;
if (!result[0]) {
addUser();
console.log('User ' + username + ' added.');
callback('Success!');
} else {
console.log('User ' + username + ' already exists.');
callback('User already exists!');
}
})
}
您最终将callback
用于同步和异步响应。 registerUser
最终会以这种方式进行调用:
registerUser(username, password, function(state) {
console.log("Message was:", state);
});
我注意到的其他一些事情: