在匿名函数中更改/获取variables

这是我的代码,我在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 statevariables被分配并按预期返回。 但是,在connection.query匿名函数中执行的代码不是分配state并且在#33行上的返回没有任何返回。

我不确定是否有variables作用域或与该connection.query有问题。查询是非阻塞的,并且在匿名函数之前正在执行第33行的返回。

有没有什么办法使这个工作,并返回state从匿名函数?

先谢谢你。

.query似乎是asynchronous的,这意味着它可能 return state; 之后执行return state; 被执行。 你需要做的是为registerUser提供一个callback参数:

 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!'); } }) } 

您将最终使用同步和asynchronous响应的callbackregisterUser最终会以这种方式进行调用:

 registerUser(username, password, function(state) { console.log("Message was:", state); }); 

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

  • SQL注入问题。
  • 最好不要从SQL调用返回HTML; 您不想将视图级别的问题注入到数据层中。