This question already has an answer here:
Nodejs asynchronous database function needs synchronous answer
                                
                                    (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!');

            }
    })
}


您最终将对同步和异步响应都使用callbackregisterUser将最终以这种方式被调用:

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