NestJS - 默认(通配符)路由?
NestJS - Default (wildcard) route?
在我的 Angular 应用程序中,如果我加载主页 /
然后导航到 /products
,它工作正常(它是一个延迟加载的模块)。但是,如果现在我重新加载页面,浏览器会对服务器进行 GET /products
调用,这会导致 404.
解决方案是发送 index.html
并且 Angular 应用程序重新打开 rails。所以在 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
],
})
它有效,但似乎有点矫枉过正。这是要走的路还是有更简单的技巧?
您不需要创建单独的 GenericModule
。但是,GenericController
是完全有效的,您的方法绝对是一个好方法。问题是您希望使用这种通用路线实现什么。如果处理 "Route not found" 错误是您的要求,更好的选择是异常过滤器。
因此,最好使用 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`
}
}
可能不行,稍后测试
在我的 Angular 应用程序中,如果我加载主页 /
然后导航到 /products
,它工作正常(它是一个延迟加载的模块)。但是,如果现在我重新加载页面,浏览器会对服务器进行 GET /products
调用,这会导致 404.
解决方案是发送 index.html
并且 Angular 应用程序重新打开 rails。所以在 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
],
})
它有效,但似乎有点矫枉过正。这是要走的路还是有更简单的技巧?
您不需要创建单独的 GenericModule
。但是,GenericController
是完全有效的,您的方法绝对是一个好方法。问题是您希望使用这种通用路线实现什么。如果处理 "Route not found" 错误是您的要求,更好的选择是异常过滤器。
因此,最好使用 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`
}
}
可能不行,稍后测试