我正在Nest.js中开发一个后端,该后端应在所有根级路由(index.html
,/about
等)上服务于React生成的/contact-us
以/api
开头的那些。这是我目前在AppController
中所做的:
@Get('/')
@Get('/contact')
@Get('/about-us')
fileServingRoutes(@Res() res: Response) {
return res.sendFile('index.html', { root: AppModule.getStaticAssetsRootPath() });
}
有没有办法手动定义所有必须发送文件的路由?
答案 0 :(得分:1)
我建议遵循Bo出色的article服务SPA。该设置考虑了Angular,但对于React应用程序是相同的。
定义一个中间件功能,该功能将除/api
之外的所有路由重定向到您的index.html
。
@Middleware()
export class FrontendMiddleware implements NestMiddleware {
use(req, res, next) {
const { url } = req;
if (url.indexOf('/api') === 1) {
next();
} else {
res.sendFile(resolvePath('index.html'));
}
}
}
在您的AppModule
中为所有路线注册它:
export class ApplicationModule implements NestModule {
configure(consumer: MiddlewaresConsumer): void {
consumer.apply(FrontendMiddleware).forRoutes(
{
path: '/**',
method: RequestMethod.ALL,
},
);
}
}
答案 1 :(得分:1)
我略微修改了Kim的解决方案以满足我的需要(我正在使用版本5.8.0),以防万一您收到中间件未正确实现NestMiddleware
接口(由于{{1} }方法),则可以使用functional middleware;
resolve
我还使用export function FrontendMiddleware(req, res, next) {
const { baseUrl } = req;
if (baseUrl.indexOf('/api') === 0) {
next();
} else {
res.sendFile(<path to your index.html file>);
}
}
代替了baseUrl
属性,当我尝试访问url
路由时返回了/
。