如何通过NodeJs和sqlite检查用户名和密码?

时间:2016-11-26 09:50:35

标签: node.js sqlite

我正在尝试检查用户名和密码(我通过帖子获得),如果它正确,请回复用户页面。

由于某种原因,我总是失败(虽然我知道用户和传递是正确的):

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

我做错了什么?

这是验证详细信息的正确方法吗?

1 个答案:

答案 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.senduserName查询,则会看到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.