排除Nest.js中所有/ api路由以服务React应用

时间:2019-03-25 09:51:50

标签: javascript node.js typescript routing nestjs

我正在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() });
}

有没有办法手动定义所有必须发送文件的路由?

2 个答案:

答案 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路由时返回了/