This question already has an answer here:
Nodejs asynchronous database function needs synchronous answer
(1个答案)
5年前关闭。
这是我在node.js和node-mysql module.中执行的代码
触发#4&#8行上的if语句后,按预期分配
我不确定变量作用域是否存在问题,或者
有什么方法可以使这项工作并从匿名函数还返回
先感谢您。
您最终将对同步和异步响应都使用
我注意到了其他一些事情:
SQL Injection问题。
最好不要从SQL调用中返回HTML。您不想将视图级别的关注点注入数据层。
(1个答案)
5年前关闭。
这是我在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&#8行上的if语句后,按预期分配
state
变量并返回。但是,在connection.query
中的匿名函数中执行的代码未分配state
,第33行的返回未返回任何内容。我不确定变量作用域是否存在问题,或者
connection.query
是否未阻塞,并且在匿名函数之前执行了第33行的返回。有什么方法可以使这项工作并从匿名函数还返回
state
吗?先感谢您。
最佳答案
.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);
});
我注意到了其他一些事情:
SQL Injection问题。
最好不要从SQL调用中返回HTML。您不想将视图级别的关注点注入数据层。
关于javascript - 在匿名函数中更改/获取变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19894314/
10-09 19:55