gpt4 book ai didi

node.js - Express 4,将 req.path 与 URL 参数匹配

转载 作者:太空宇宙 更新时间:2023-11-03 23:16:22 25 4
gpt4 key购买 nike

我为 Express 路由器制作了一个自定义中间件,它允许我将 API 的某些端点列入白名单,以排除身份验证。但是,我有一条依赖于 URL 参数的路线,但我无法让我的中间件按预期工作。显然 :profileId 没有执行任何操作,并且我的 API 端点仍然需要身份验证。

我需要从身份验证中排除该路径的原因是因为我的 React 前端应该向公众显示该数据(无需人们注册和登录)。有什么建议可以解决这个问题吗?

const apiAuth = (req, res, next) => {
let authRequired = true;

if (
req.path == "/api/users/register" ||
req.path == "/api/users/login" ||
req.path == "/api/profiles/:profileId"
) {
authRequired = false;
}

if (authRequired == true) {
// Auth check logic
}
}

最佳答案

有一些更好的方法来处理中间件的需求,通常比您建议的方法更有用:

仅在您需要的路由上包含您的身份验证中间件:

const authenticationMiddleware = (req, res, next) => {
// your login check logic
}

router.get('/api/users/me', authenticationMiddleware, (req, res, next) => {
// your route logic, this endpoint now requires you to be logged in, as you have specified your authentication middleware in the declaration,
})

router.get('/api/profiles/:profileId', (req, res, next) => {
// your route logic, this endpoint does not require you to be logged in as you have not put the middleware in the route delcaration
})

或者,根据调用路由的位置添加身份验证中间件:

router.get('/api/profiles/:profileId', (req, res, next) => {
// your route logic, this endpoint does not require you to be logged as we have not told our router to use the middleware yet
})

router.use(authenticationMiddleware)

router.get('/api/users/me', (req, res, next) => {
// your route logic, this endpoint now requires you to be logged in, as the router has been told to use the middleware at this point.
})

为什么使用这些方法?尝试将您所做的所有 routerapp 调用视为添加到堆栈中,Express 使用该堆栈来处理对您的网站或 API 的调用。当它通过查找路由的方式工作时,它将调用它在途中找到的任何中间件。

这解决了必须声明需要或不需要特定身份验证等的路由列表或数组的问题。

如果您希望中间件正常工作,您还需要确保在中间件中调用 next(),因为这会告诉 Express 继续遍历它拥有的所有路由/中间件。

关于node.js - Express 4,将 req.path 与 URL 参数匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55001398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com