Javascript 使用express和sqlite3
所以我有一个名为user.db的数据库,表是 用户id、用户名、密码 当我从主线程调用这个函数时,它可以工作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
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)=>{