我正在尝试检查用户名和密码(我通过帖子获得),如果它正确,请回复用户页面。
由于某种原因,我总是失败(虽然我知道用户和传递是正确的):
app.post("/loginDetials", function(req, res) {
var userName = req.body.userName;
var passw = req.body.passw;
if(req.body.userName && req.body.passw)
{
console.log('Checkking userName: ' + userName + ' password: ' + passw);
var db = new sqlite3.Database('usersDataBase');
db.all("SELECT * FROM usersTable where (userName==?) AND (password==?)", function(err,rows){
if (err)
{
console.log('Error: ' + err);
}
else
{
rows.forEach(function (row) {
console.log('Login Succ')
res.sendFile('userSite.html', {root: __dirname })
});
}
});
db.close();
}
console.log('Login Fail')
res.sendFile('main.html', {root: __dirname })
});
我做错了什么?
这是验证详细信息的正确方法吗?
答案 0 :(得分:0)
您的代码有一些异步代码和其他流量问题。
您实际上发送了两次响应,并在执行查询之前关闭了数据库。
res.send
var userName = req.body.userName;
var passw = req.body.passw;
if(req.body.userName && req.body.passw) {
/** Some logic */
res.send(...);
}
res.send(...);
因此,如果您提供了res.send
和userName
查询,则会看到passw
被调用两次。
在JavaScript中,我们有异步函数,它们不会停止程序的流程并依赖于回调。 db.all
就是这样一个函数,您可以调用它,然后立即调用db.close()
var db = new sqlite3.Database('usersDataBase');
db.all("SELECT * FROM usersTable where (userName==?) AND (password==?)", function(err,rows){
// You need to move your `db.close()` inside the callback
// in order to close the database when the query has ended
db.close();
if (err)
{
console.log('Error: ' + err);
}
else
{
rows.forEach(function (row) {
console.log('Login Succ')
res.sendFile('userSite.html', {root: __dirname })
});
}
});
// db.close(); <-- commented out.