在我的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
],
})
它有效,但似乎有点矫枉过正。这是要走的路还是有一个更简单的伎俩?
答案 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;错误是您的要求,更好的选择是异常过滤器。