在Aurelia路由器中强制使用小写网址

时间:2018-01-18 17:16:31

标签: typescript aurelia aurelia-router aurelia-navigation

我正在使用TypeScript应用程序开发Aurelia CLI v0.32,RequireJS。我的应用程序有几个路由,其中​​一些有参数。问题是外部引用者可能会重定向到大写的路线或参数。

我想要的是我的所有路线 - 或更好地说:网址 - 以小写显示。为此,如果需要,我也愿意转换所有params值。

路由定义的示例,其中:company:orderid是字符串:

{ route: ':company/:orderid', name: 'order-detail', moduleId: ... etc }

实际请求可能是:

http://localhost:9000/ACME/ABC-123-42

预期的行为是浏览器网址小写为:

http://localhost:9000/acme/abc-123-42

注意:如果您熟悉C#/ ASP.NET MVC,您会注意到我实际上在寻找以下行为:

services.AddRouting(options => options.LowercaseUrls = true);

我无法在Aurelia文档中找到与此相关的任何内容,特别是the RouterConfiguration。四处寻找,我确实找到了一种感觉有点hacky的方式。但也许我在这里正确的轨道上我将PreActivateStep添加到routerconfig:

private configureRouter(config: RouterConfiguration, router: Router): void {
    config.title = 'My LowerCaseUrl App';
    config.options.pushState = true;
    config.addPreActivateStep(EnforceLowerCaseUrls);
    config.map(Routes.maps());

    this.router = router;
}

这是感觉hacky的部分的实现:

import { NavigationInstruction, Next, activationStrategy } from 'aurelia-router';

export class EnforceLowerCaseUrls {
    public async run(nav: NavigationInstruction, next: Next): Promise<any> {
        console.log('nav: ', nav);

        if (nav.params) {
            // lowercase the 'framgment' alone doesn't seem to be enough
            nav.fragment = nav.fragment.toLowerCase();

            // *replace* the params with all lowercase values
            this.convertAllPropertiesToLowerCase(nav.params);

            // the router has a navigateToRoute, which allows me to replace the url
            // inspiration: https://stackoverflow.com/questions/39244796/aurelia-router-modify-route-params-and-address-bar-from-vm-with-router
            nav.router.navigateToRoute(
                nav.config.name,
                nav.params,
                { trigger: false, replace: true }
            );
        }
        return next();
    }

    private convertAllPropertiesToLowerCase(o: any) {
        // hacky attempt to convert the values of an object to lowercase
        Object.keys(o).forEach((k) => {
            if (o[k])
                o[k] = o[k].toLowerCase();
        });
    }
}

现在它部分工作了。在主要路线/ companyid /它工作。但随着更深的路线,这会打破。我确信通过一些工作,我可以让它运行起来。但在我进一步深入研究之前,我的问题是:

  1. 假设没有原生的Aurelia方式来配置这个,是否正在使用 PreActivateStep 来获得所需的行为?
  2. 我需要转换为小写的nav.*是否有特定属性
  3. 或者我在这里完全走错路? 感谢。

    更新:马修的答案似乎有效!

1 个答案:

答案 0 :(得分:2)

在next.cancel中使用重定向

import { NavigationInstruction, Next, activationStrategy, Redirect } from 'aurelia-router';

export class EnforceLowerCaseUrls {
    public async run(nav: NavigationInstruction, next: Next): Promise<any> {
        if (/[A-Z]/.test(nav.fragment)) {
            return next.cancel(new Redirect(nav.fragment.toLowerCase()));
        } else {
            return next();
        }
    }
}