检查动态路线快递js

时间:2018-10-15 18:04:59

标签: javascript node.js typescript express

我有一些路由,例如/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,我要问的可能吗?

2 个答案:

答案 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()

希望它对某人有帮助!