Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用express和sqlite3_Javascript_Node.js_Express_Node Sqlite3 - Fatal编程技术网

Javascript 使用express和sqlite3

Javascript 使用express和sqlite3,javascript,node.js,express,node-sqlite3,Javascript,Node.js,Express,Node Sqlite3,所以我有一个名为user.db的数据库,表是 用户id、用户名、密码 当我从主线程调用这个函数时,它可以工作 function check_login(username, hashpassword){ user_db.all("SELECT * FROM users", [], (err, rows)=>{ console.log(rows) });} 但是当我从express函数调用它时 app.post("/log_in/:cookie", (req, res) =&g

所以我有一个名为user.db的数据库,表是 用户id、用户名、密码

当我从主线程调用这个函数时,它可以工作

function check_login(username, hashpassword){
 user_db.all("SELECT * FROM users", [], (err, rows)=>{
     console.log(rows)
 });}
但是当我从express函数调用它时

app.post("/log_in/:cookie", (req, res) =>{
let cookie = req.params.cookie;
if (cookie != "")
{
    let user_id = check_login(req.body.username, req.body.hashpassword);
    console.log(user_id);
    if( user_id != ""){
        let code = create_code(get_info_by_cookie(cookie, user_id));
        res.json({"code":code})
    }
    else{
        res.json({"error":"username or password doesn't match"})
    }

}
else{
    res.json({"error":"no cookie was given"})
}
    });
这是未定义的打印


有人能告诉我为什么当我从另一个脚本或在主线程中调用函数时,它可以正常工作,但当它从app.post()调用时,它不工作

SQLite3函数是异步的,因此您的代码不能假定它得到了返回值。但更重要的是,您忘记了使用Express的中间件功能概念。让我们来解决这个问题。首先,让我们将用户检查函数定义为一个中间件函数,使用普通的JS约定来命名事物,而不是Python约定

首先,检查cookie值:

功能检查cookie(请求、恢复、下一步){
让cookie=req.params.cookie;
如果(!cookie)返回next(新错误(“未找到cookie”);
next();
}
然后,检查用户的登录:

功能检查登录(req、res、next){
让username=req.body.username,
hashpassword=req.body.hashpassword;
user_db.all(“从用户中选择*,[],(错误,行)=>{
if(err)返回next(err);
// ...
//你的代码在这里。你没有显示任何,所以我也没有发明任何。
// ...
if(hasAccess)返回next();
返回next(新错误(`user${username}没有访问权限`);
});
}
现在我们可以在适当的快递链中使用:

app.post(“/log\u in/:cookie”),checkCookie,checkLogin,(req,res)=>{
//我们知道这个用户有一个cookie集,并且他们的登录状态良好。
//所以这个函数所要做的就是形成你所需要的任何响应
//考虑到这两件事是真的
});

您的
check\u login
函数没有返回任何内容。但这不是一个快速修复方法,因为
user\u db.all()
启动一个异步请求,因此需要一个回调函数来处理结果。请尝试以下操作:@ChrisG ya谢谢您的帮助。我简化了check_log in函数,以确保人们了解我的问题。我们有什么方法可以更轻松地进行沟通(discord等)因为我真的需要帮助,试着用这个来代替:这样你就不必自己用承诺代码来包装所有东西。除此之外,恐怕你还需要自己去弄清楚。@ChrisG好的,谢谢,最后一个问题,如果我想在check\u登录中添加一个条件,检查参数提供给我的用户名和密码是否匹配如果是,则返回该用户的用户id。您需要将变量插入查询:
user\u db.all(“从username=?和hashpassword=?”的用户中选择*,[username,hashpassword],(err,rows)=>{