在匿名函数中更改/获取变量

时间:2013-11-10 19:49:50

标签: javascript node.js

以下是我在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

提前谢谢。

1 个答案:

答案 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);
});

我注意到的其他一些事情:

  • SQL Injection问题。
  • 从SQL调用中返回HTML更好 ;您不希望将视图级别的问题注入数据层。