【问题标题】:Setup an authentication middleware to reduce duplicate code in Express.js设置身份验证中间件以减少 Express.js 中的重复代码
【发布时间】:2020-06-23 18:39:57
【问题描述】:

正如标题所示,我想为我调用的每条新路由减少重复的授权码。 My problem is exactly the same as the user in this post, 因为显然我们从 GitHub 存储库下载了相同的项目。

我尝试了答案中建议的两种解决方案,但是即使我已登录,它也会限制我访问这些路由。

代码如下:

router.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();
            }
        }
    });
}

非常感谢任何帮助!

来源:How to setup an authentication middleware in Express.js

【问题讨论】:

    标签: javascript node.js express middleware


    【解决方案1】:

    在您引用的答案中,用户似乎已安装并正在使用 Sequelize 来存储个人的用户数据。如果您想利用这种方法,我会研究 Sequelize。正如您在另一个线程中提到的,用户未定义。对于另一个问题,提问者很可能设置了一个名为 User 的 模型

    在 Sequelize 中,每个模型(如 User)都定义了一个具有自己的行和列的表。每列代表一个应用于单个数据行的字段。例如,对于 User 模型,一个用户可能有一个用户名、一个电子邮件和一个密码。您将指定这些列应该是什么数据类型以及 Sequelize 模型定义的每一列的任何其他必要信息。每行代表一个数据条目,或者在这种情况下,代表一个用户。我之前构建了一个示例网络应用程序,将学生映射到特定的班级;下面我复制了我为该项目编写的 Sequelize 模型定义。这很简单,如果您对这个库不熟悉,我建议您观看一些 YouTube 教程或查看 sequelize.org 上的 Sequelize 文档。

    Student.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 所依赖的基本框架也可能会有所帮助。

    【讨论】:

    • 感谢您的回答!我不是故意粗鲁,但我没有看到其他用户问题的任何续集。我忘了提到使用的数据库是 Mongo 而不是 SQL,对此感到抱歉。我已经声明了一个用户模式,我只是想减少重复代码,这只是我的一些奇怪的迷信
    猜你喜欢
    • 2021-08-30
    • 2019-06-12
    • 2021-01-20
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多