首页 > 解决方案 > 设置身份验证中间件以减少 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();
            }
        }
    });
}

任何帮助将不胜感激!

资料来源:如何在 Express.js 中设置身份验证中间件

标签: javascriptnode.jsexpressmiddleware

解决方案


在您引用的答案中,用户似乎已安装并使用 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 所依赖的基本框架也可能会有所帮助。


推荐阅读