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

Posted

技术标签:

【中文标题】NestJS - 默认(通配符)路由?【英文标题】:NestJS - Default (wildcard) route? 【发布时间】:2018-09-27 11:45:05 【问题描述】:

在我的 Angular 应用程序中,如果我加载主页 /,然后导航到 /products,它可以正常工作(它是一个延迟加载的模块)。但是如果现在我重新加载页面,浏览器会向服务器发出 GET /products 调用,这会导致 404。

解决方案是发送index.html,然后 Angular 应用程序恢复正常。所以在 Express 中,我使用 app.all("*", (req,res) => res.sendFile("index.html") ) 并且它有效。

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

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

我真的必须为此创建一个带有控制器的完整独立模块吗?我就是这么做的

@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
    ],
)

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

【问题讨论】:

这里很好的样板:github.com/Innovic-io/angular-nestjs-rendering 你也可以使用angular-cli。由于它使用了angular-cli,前端应用程序使用单独的express 实例,并且它已经配置为处理未找到的请求... 哦,我一直在使用 Angular CLI。但是front app use separate express instance 是什么意思? Express 是服务器端的 我的意思是 angular-cli 使用单独的 express 实例 但那是ng serve,不是吗?它是 CLI 的内置服务器。我没有使用ng serve,我正在构建自己的服务器。无论如何,你的答案奏效了。谢谢! 是的,你是对的。它是本地调试应用程序时使用的 CLI 的内置服务器。在生产过程中,您当然需要自己的服务器,在您的情况下使用NestJS 【参考方案1】:

所以,最好使用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`
    

可能不行,待会再测试

【讨论】:

@JeremyThille,很高兴听到这个消息? 这在大多数情况下都有效,但是 - 问题是返回 404 的有效路由(如 GET /items/ 将返回 index.html 而不是 404。问题是如何只处理不匹配的路由。【参考方案2】:

您无需创建单独的GenericModule。但是,GenericController 是完全有效的,您的方法绝对是一个好方法。问题是您希望使用此通用路线实现什么目标。如果您需要处理“找不到路由”错误,则更好的选择是异常过滤器。

【讨论】:

多么荣幸。这个人自己:) 我想做的是sendFile("index.html")。让我解释。在我的 Angular 应用程序中,如果我加载主页 /,然后导航到 /products,它工作正常(它是一个延迟加载的模块)。但是,如果现在我重新加载页面,浏览器会向服务器发出 GET /products 调用,这会导致 404。解决方案是发送 index.html 并且 Angular 应用程序会重新运行。所以在 Express 中,我使用 app.all("*", (req,res) => res.sendFile("index.html") ) 并且它有效。如何在没有模块的情况下实现GenericController?还是没搞清楚 @JeremyThille 的意思类似于angular.io/guide/… @JeremyThille,我想,你的问题可以用你上面的评论代替 ? 原来如此,确实如此,谢谢指教:)

以上是关于NestJS - 默认(通配符)路由?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5:API 路由 + 通配符路由导致意外行为

思科路由器ACL通配符

带有通配符的 Laravel 路由总是 404

如何在命名路由有通配符的情况下使用命名路由

在codeigniter路由中使用通配符?

如何从通配符路由重定向到主页?