Node.js “节点JS未更新”;全局变量";
代码的预期用途是检查数据库是否具有以对象用户的形式传递给函数的用户名和密码 我将success变量初始化为false。然后我说如果我找到了记录,我会把它设置为真。但是,即使找到记录,success变量仍然为false。变量似乎没有更新。为什么? 此外,如何传回整个fetcheduser结果,同时指示是否找到记录?非常感谢Node.js “节点JS未更新”;全局变量";,node.js,azure,Node.js,Azure,代码的预期用途是检查数据库是否具有以对象用户的形式传递给函数的用户名和密码 我将success变量初始化为false。然后我说如果我找到了记录,我会把它设置为真。但是,即使找到记录,success变量仍然为false。变量似乎没有更新。为什么? 此外,如何传回整个fetcheduser结果,同时指示是否找到记录?非常感谢 LoginSuccess : function (User) { var success = false; function isEmptyObject(ob
LoginSuccess : function (User) {
var success = false;
function isEmptyObject(obj) {
return !Object.keys(obj).length;
}
function isEmptyObject(obj) {
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
return false;
}
}
return true;
}
var sql = require('mssql');
var config = require('./configuration/sqlconfig');
var fetcheduser;
sql.connect(config).then(function () {
console.log('Connected to DB');
new sql.Request().query("SELECT * FROM dbo.LocalUser WHERE Username = '" + User.username + "' AND Password = '" + User.password + "';")
.then(function (recordset) {
if (isEmptyObject(recordset)) {
console.log("The User does not exist");
} else {
fetcheduser = JSON.parse(JSON.stringify(recordset));
success = true;
console.log("The user is existed.");
}
}).catch(function (err) {
//When errors come
});
});
return success;
}
为了获得正确的
成功
状态,您需要回报您的承诺。就像这样
function LoginSuccess() {
var success = false;
return sql.connect(config)
.then(() => {
return new sql.Request().query(...).then(
() => success = true,
() => success = false
);
})
.then(() => {
return success;
});
}
LoginSuccess().then(success => ...);
实际上-变量正在更新,但太晚了-在您返回它之后。尝试创建一个
result={success:false}
并在返回后立即检查result
,5秒后(或任何适当的时间),您将看到它已更改:setTimeout(()=>console.log(result),5000)
不管怎么说,对于生产来说,选择承诺解决方案。Node 7.6现在终于实现了async/await,因此您可以摆脱难看的
…然后解决方法。让我问您:哪一个先到:将success设置为true,还是返回结果?提示:这可能不是你想的。另外,您的select语句对于注入攻击来说已经成熟——想想Bobby Tables吧……它是异步的:在设置为true之前返回success。那么如何在返回success之前将其设置为true呢?这是一个非常流行的问题(某些版本的语句可能会被问上一千次)。您的sql.connect()
和sql.Request().query()
函数是异步的。这意味着您的函数在这些操作完成之前返回。因此,您不能从函数返回它们的结果。相反,您必须使用回调或承诺来反馈结果。所有选项都在中描述,您的选项被标记为的副本。