javascript - 设置身份验证中间件以减少 Express.js 中的重复代码
问题描述
正如标题所示,我想为我调用的每条新路由减少重复的授权码。 我的问题与这篇文章中的用户完全相同,因为显然我们从 GitHub 存储库下载了相同的项目。
我尝试了答案中建议的两种解决方案,但是即使我已登录,它也会限制我访问这些路由。
这是代码:
路由器.js
// GET route for reading data
router.get("/", function (req, res, next) {
return res.sendFile(path.join(__dirname + "/login"));
});
//Export authorization module
var auth = require("../auth");
//Verify if user is authorized to access this route
router.get("/complete-profile", auth.isAuthorized, function (req, res, next) {
return res.sendFile(path.join(__dirname, "../public", "image.html"));
});
//READ THE IMAGE UPLOAD FOLDER
router.use(express.static("public"));
// GET route after login, verify if user logged in
router.get("/complete-profile", function (req, res, next) {
User.findById(req.session.userId).exec(function (error, user) {
if (error) {
return next(error);
} else {
if (user === null) {
var err = new Error("Not authorized! Go back!");
err.status = 400;
return next(err);
} else {
//SEND NEW USERS TO IMAGE UPLOAD PAGE
return res.sendFile(path.join(__dirname, "../public", "image.html"));
}
}
});
});
正如建议的那样,我尝试将所有这些声明为中间件,所以这里是中间件:
auth.js
module.exports.isAuthorized = function(req, res, next) {
User.findById(req.session.userId).exec(function (error, user) {
if (error) {
return next(error);
} else {
if (user === null) {
var err = new Error('Not authorized! Go back!');
err.status = 400;
return next(err);
} else {
return next();
}
}
});
}
任何帮助将不胜感激!
解决方案
在您引用的答案中,用户似乎已安装并使用 Sequelize 来存储个人的用户数据。如果您想利用这种方法,我会研究 Sequelize。正如您在另一个线程中提到的,用户未定义。对于另一个问题,提问者很可能建立了一个名为 User的模型。
在 Sequelize 中,每个模型(如User)定义一个具有自己的行和列的表。每列代表一个应用于单个数据行的字段。例如,对于 User 模型,一个用户可能有一个用户名、一个电子邮件和一个密码。您将指定这些列应该是什么数据类型以及 Sequelize 模型定义的每一列的任何其他必要信息。每行代表一个数据条目,或者在这种情况下,代表一个用户。我之前构建了一个示例网络应用程序,将学生映射到特定的班级;下面我复制了我为该项目编写的 Sequelize 模型定义。这很简单,如果您对这个库不熟悉,我建议您观看一些 YouTube 教程或查看 sequelize.org 上的 Sequelize 文档。
学生.js
'use strict';
const Sequelize = require('sequelize');
const db = require('./_db');
const Student = db.define('student', {
name: {
type: Sequelize.STRING,
allowNull: false,
validate: {
notEmpty: true
}
},
phase: {
type: Sequelize.STRING,
allowNull: true,
validate: {
isIn: [['junior', 'senior', null]]
}
}
});
Student.findByPhase = async function(phase) {
const students = await Student.findAll({
where: {
phase: phase
}
})
return students
}
module.exports = Student;
总体上检查 PostgreSQL 或 SQL 以及了解 Sequelize 所依赖的基本框架也可能会有所帮助。
推荐阅读
- javascript - 将 css 变量导入主题的根选择器
- spring-boot - Spring-Boot、JPA 事务和 RabbitMQ 接收器 => 不一致的数据库状态
- typescript - 来自 OL-EXT 库和 Typescript 的动画集群
- node.js - 猫鼬攻击与总和和计数
- permissions - RSC 与#Linkedin 与 Bullhorn 的集成 - 权限问题
- python - 从逻辑表(sympy,sagemath)在 Python 中创建 Dnf 和 Cnf
- c - 函数和链表
- java - JUnit 5,尽管@Timeout 测试没有失败
- google-sheets - Google表格中带有OR条件的SUMIFS
- python - 如何使python方法像sqlalchemy一样接受表达式