我有一些路由,例如/login/:provider/:id
,执行请求时,它得到的内容类似于/login/provider1/123
。到目前为止,一切都很好,但是当我想拥有某些未经中间件认证的路由时,就会出现问题。
到目前为止,我已经尝试过这样:
public static getString(value: String): String {
let values = value.split('/');
if (values.length <= 2) return value;
return values.slice(0, values.length - 1).reduce(((previousValue, currentValue) => {
return previousValue + "/" + currentValue;
}));
}
但是它不是很通用,不能涵盖所有情况。
它应与原始路线匹配的是:
/login/anything/anything
因此,我采用以下路线:/login/:provider/:id
包含3个细分:
[登录名,提供者,ID],因此从/ login开始且具有相同段数的所有内容都应匹配。
,并且如果没有相同长度的段,则不应匹配任何内容。
我的问题是:在发出请求后,是否有任何特定的方法来获取原始路由而不进行循环?通过regexp,我要问的可能吗?
答案 0 :(得分:1)
我认为您需要针对路线的自定义验证器。
您可以创建路由器。
var app = express();
var router = express.Router();
router.param(function(param, validator) {
return function(req, res, next, val) {
// You have full access to req. So you can get anything from it.
if (validator(val)) {
next(); //validator success no need for authorization.
} else {
if (req.headers.Authentication) {
next() //Validator failed but we have token in header and it is valid.
} else {
res.sendStatus(403); //Validator failed and token does not exists.
}
}
}
});
router.param('provider', function(candidate) {
return candidate === 'myprovider' //Provider condition that will bypass authorization.
});
router.get('/login/:provider/:id', function (req, res) { //register the route
res.send('OK');
});
app.use(router);
编辑2(另一种尝试):
app.all('/:id/:name', (req, res, next) => {
console.log(req.params);
next();
});
这仅与此类路由匹配。而且它将在它们之前起作用,因此您可以访问所需的每个参数。
答案 1 :(得分:0)
我想到的唯一肮脏的解决方案是:
*User*: Alexa, add pick up the kids tomorrow at 4pm to my "Priority 1" list.
*Alexa*: Added
*User*: Alexa, what's in my "priority 1" list tomorrow
*Alexa*: You have to pick up the kids tomorrow at 4pm
其中public static doesNotRequireAuth(value: String): boolean {
let delimiter = "/";
let segments = value.split(delimiter);
let conditionMet = false;
getNoAuthRoutes().forEach((item) => {
let itemSegments = item.split(delimiter);
if (segments[1] === itemSegments[1] && segments.length === itemSegments.length) {
conditionMet = true;
return;
}
});
return conditionMet;
}
是getNoAuthRoutes()
。
希望它对某人有帮助!