我正在关注一些与快递有关的教程。
作者在那里制作了一个中间件
function authCheck (req, res, next) {
if (req.user) next()
else res.redirect("/somepath")
}
然后在API路由中,他像这样
router.get("/emailfetch", authCheck, async (req, res) => {
})
问题
所以我有三个问题。
第一名我们的authCheck
功能可以完成三件事
function authCheck (req, res, next) {
而且我看不到我们在get路由中间件中调用它们时传递了它们,因此它如何获得req, res, next
第二个。假设我制作了一个辅助函数文件 helper.js ,我们的helper.js是否可以访问req,res,next
?
第三次,他为什么不做 authCheck(),而是为什么他只是做 authCheck
答案 0 :(得分:2)
1。 function authCheck (req, res, next)
:是中间件
这里
详细了解middleware
express提供用于传递中间件的语法,如下所示:
route.get('/your_route',yourMiddlewareFuntion,function(req,res){
});
因此您的中间件功能可以访问request
和response
对象。
2。是的,您可以在单独的文件中创建自定义中间件,然后在您的路由中使用它。
示例:您的helper.js
类似于:
module.exports = function(req,res,next){
// middleware logic goes here
// like check users is logged in or not
if(req.user){
// user is logged in so able to access private route like dashboard
next();
}else{
// redirect user to login page
return res.redirect('/login');
}
}
所以现在您定义
之类的路线var checkAuth=require('./helper');
route.get('/dashboard',checkAuth,function(req,res){
// user is logged in , find some data and display it
return res.render('/dashboard');
});
当您在浏览器中点击此路线/ dashboard时,请求将 首先通过checkAuth中间件,它检查您是否已登录或 否,如果您尚未登录,将被重定向到登录页面, 否则您的请求将传递到下一个块,即您的函数 / dashboard route,即会获取自定义数据并将其显示在 仪表板。
3。在上面的示例中,我们通过要求使用中间件功能并将其分配给checkAuth
变量,因此这就是为什么我们使用checkAuth
而不是checkAuth()
或者您可以在路由中直接使用function(req,res,next){}
作为中间件
答案 1 :(得分:1)
1)Express使用next
函数来移动到链中的下一个中间件。默认情况下,相同的req
,res
和next
参数被传递到每个中间件,因此您可以简单地调用next()
而不是通过next(req, res, next)
显式传递参数。 。很少需要覆盖这些参数,但是这种类型的场景存在该机制。
2)只要将helper.js
作为中间件传递,就可以。
3)中间件必须作为函数ref传递,因为Express随后会在内部调用它。在场景中,您可能会看到像func()
这样的中间件,它会在内部返回与Express中间件签名匹配的函数,例如
function middleware() {
return (req, res, next) => {
...
}
}
...
router.get("/path", middleware(), ...
这种方法本身没有任何价值,但是在您希望将其他信息传递给中间件而不是依赖于全局变量的场景中很有用。