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/您无需创建单独的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 - 默认(通配符)路由?的主要内容,如果未能解决你的问题,请参考以下文章