javascript - 如果用户名和密码匹配数据库,则登录用户并将他发送到个人资料页面,否则 console.log("error")
问题描述
需要做这个作业,用户输入他的用户名和密码,如果它匹配数据库会将用户发送到配置文件页面,其中显示“你好 <%= user.username %>,似乎无法让它工作,它总是停留在同一页面,但从数据库中获取用户信息。
早期版本有效并将用户发送到个人资料页面,但即使输入错误,它仍然发送给他,所以很明显我试图阻止这种情况。
const express = require('express');
const bodyParser = require("body-parser");
const app = express();
const connection = require("./connect");
// parse application/x-www-form-urlencoded
var urlencodedParser = bodyParser.urlencoded({ extended: false });
app.set("view engine", "ejs");
// DB
connection.connect((err) => {
if (err) throw err;
else console.log("Database connected!");
});
app.get("/", (req, res) => {
res.render("login");
});
app.get("/profile", (req, res) => {
console.log(user);
res.render("profile", { user })
})
app.post("/", urlencodedParser, async (req, res) => {
user = await queryFunction("select * from users where users.username = " + connection.escape(req.body.username) +
" and users.password = " + connection.escape(req.body.password));
console.log(user)
if (req.body.username === user.username && req.body.password === user.password) return res.redirect("/profile")
else console.log("Something went wrong!")
});
async function queryFunction(queryString) {
let results = await new Promise((resolve, reject) => connection.query(queryString, (err, results) => {
if (err) {
reject(err);
}
else {
resolve(results);
}
}))
return results;
};
解决方案
您可以使用express-session
包来跟踪用户会话。此示例MemoryStore
用作默认值。
笔记:
默认的服务器端会话存储 MemoryStore 故意不是为生产环境设计的。它在大多数情况下会泄漏内存,不会扩展到单个进程,并且用于调试和开发。
你可以db
用来存储你的会话。根据db
类型,可提供各种连接器。更多关于会话和数据库连接器的信息在这里
var session = require('express-session')
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}))
app.post("/", urlencodedParser, async (req, res) => {
...
if (req.body.username === user.username && req.body.password === user.password) {
// you can then set some variable to session to track login status
res.session.loggedin = true
return res.redirect("/profile")
}
else console.log("Something went wrong!")
});
例如,您可以在其他地方
app.get("/profile", (req, res) => {
if (!req.session.loggedin) {
res.render("login");
} else {
console.log(user);
res.render("profile", { user })
}
})
推荐阅读
- css - 用css将外部div悬停在底部边框上
- amazon-web-services - 如何检查 MarkLogic AWS 主机中是否启用了“托管集群功能”
- python - 如何更改 seaborn.relplot 中轴范围之间的限制
- c# - 将 FSharpAsync 对象转换为 C# 任务的正确方法是什么?
- f# - 如何使用列表更新嵌套记录结构
- c# - 将全局变量传递给类
- laravel - 我应该将此代码放在 laravel 的模型或控制器中吗
- firebase - Firebase REST API signInWithCustomToken 和 Apple 登录提供程序
- node.js - 使用 readline nodejs 提出多个问题
- intellij-idea - 简单的 Intellij Kotlin 项目无法识别 LinkedHashMap 或其他集合