NestJS - 默认(通配符)路由?

时间:2018-04-17 13:20:56

标签: express router nestjs

在我的Angular应用中,如果我加载主页/然后导航到/products,它就可以正常工作(它是一个延迟加载的模块)。但是,如果现在我重新加载页面,浏览器会对服务器进行GET /products调用,从而产生404。

解决方案是发送index.html并且Angular应用程序重新开启。所以在Express中我做app.all("*", (req,res) => { res.sendFile("index.html") })并且它有效。

如何在Nest中做同样的事情?

有一个@All装饰器,但给定组件中的每个控制器都处理一个子路由,例如@Controller("cats")将匹配/cats路由,所以如果我添加@All此控制器仅与/cats/*匹配,而不与*匹配。

我必须真的用控制器创建一个完整的独立模块吗?这就是我做的事情

@Controller() // Matches "/"
export class GenericController {

    @All() // Matches "*" on all methods GET, POST...
    genericFunction(){
        console.log("Generic route reached")
    }
}

在我的主要模块中:

@Module({
    imports: [
        ItemsModule, // Other routes like /items
        GenericModule, // Generic "*" route last
    ],
})

它有效,但似乎有点矫枉过正。这是要走的路还是有一个更简单的伎俩?

2 个答案:

答案 0 :(得分:3)

因此,最好使用global-scoped例外过滤器。

async function bootstrap() {
  const app = await NestFactory.create(ApplicationModule);
  app.useGlobalFilters(new NotFoundExceptionFilter());
  await app.listen(3000);
}
bootstrap();

<强> NotFoundExceptionFilter

import { ExceptionFilter, Catch, NotFoundException } from '@nestjs/common';
import { HttpException } from '@nestjs/common';

@Catch(NotFoundException)
export class NotFoundExceptionFilter implements ExceptionFilter {
    catch(exception: HttpException, host: ArgumentsHost) {
        const ctx = host.switchToHttp();
        const response = ctx.getResponse();
        // here return `index.html`
    }
}

也许它不起作用,稍后会测试

答案 1 :(得分:0)

您不需要创建单独的GenericModule。但是,GenericController完全有效,你接近绝对是一个好的。问题是您希望使用此通用路线实现什么目标。如果处理&#34;未找到路线&#34;错误是您的要求,更好的选择是异常过滤器。