在匿名函数中更改/获取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 state
variables被分配并按预期返回。 但是,在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响应的callback
。 registerUser
最终会以这种方式进行调用:
registerUser(username, password, function(state) { console.log("Message was:", state); });
我注意到的其他一些事情:
- SQL注入问题。
- 最好不要从SQL调用返回HTML; 您不想将视图级别的问题注入到数据层中。