1

这是我在 node.js 和node-mysql 模块中执行此操作的代码。

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从匿名函数中返回?

先感谢您。

4

1 回答 1

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 注入问题。
  • 最好不要从 SQL 调用返回 HTML;您不想将视图级别的问题注入数据层。
于 2013-11-10T19:54:43.647 回答