如何将用于认证的中间件功能从主服务器模块传递到路由器文件

问题描述 投票:0回答:1

有些新内容,请多多包涵。尝试使用passport对网站中的仅特定路径进行身份验证。路由位于名为blog_a.js的单独文件中。我在主server.js文件中创建了以下函数:

function checkAuthenticated(req, res, next) {
    if (req.isAuthenticated()){
        return next()
    }
    res.redirect('/login')
}

function checkNotAuthenticated(req, res, next) {
    if (req.isAuthenticated()){
        return res.redirect('/')
    }
    next()
}

但是,我试图将上述功能传递到blog_a.js模块中,所以我可以将它们用作中间件来保护该模块内的路由。

我已尝试在主'server.js'文件底部使用module.exports = {checkAuthenticated, checkNotAuthenticated},然后使用let server = require('../server.js')行将这些功能导入包含要保护的路由的模块。

但是,上面的server变量以未定义的形式返回,并且我尝试了几种排列/解构方法来尝试将其导入。都无济于事,由于“未定义”对象-Error: Route.get() requires a callback function but got a [object Undefined],我一直使路由失败。

如何在server.js文件中设置身份验证,然后在单个路由文件中传递其身份验证功能以用作中间件?

[我看过this solution,但是它没有清楚地说明如何将中间件功能从一个模块[server.js]转移到另一个模块[blog_a.js

javascript authentication router middleware module-export
1个回答
0
投票

我从Web Dev Simplified的Kyle收到了有关Patreon的以下回复,它的工作非常有魅力!

“您应该能够创建另一个名为authMiddleware.js或类似名称的文件。然后在该文件中定义并导出函数(module.exports = {function1,function2})。现在在在您需要这些功能的地方,您应该能够像这样导入它们(const {function1,function2} = require('./ authMiddleware'))。“

所以我遵循了Kyle的建议,并创建了以下单独的文件authMiddleware.js

function checkAuthenticated(req, res, next) {
    if (req.isAuthenticated()){
        return next()
    }
    res.redirect('/login')
}

function checkNotAuthenticated(req, res, next) {
    if (req.isAuthenticated()){
        return res.redirect('/')
    }
    next()
}

module.exports = { checkAuthenticated, checkNotAuthenticated }

...,然后使用以下require语句访问这些​​功能:

-in主server.js-> const {checkAuthenticated, checkNotAuthenticated} = require('./authMiddleware.js')

-路由器文件blog_a.js-> const {checkAuthenticated, checkNotAuthenticated} = require('../authMiddleware.js')

谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.