Okay, figured a much better solution. Controllers and modules are registered in order, so we can specify one at the end as a catch-all. For example, by using @Controller('*')
import { Controller, Get, Res, Req, Next } from '@nestjs/common';
import path from 'path';
import { NextFunction, Request, Response } from 'express';
import { createRequestHandler } from '@remix-run/express';
@Controller('*')
export class RemixController {
@Get()
getHello(
@Req() request: Request,
@Res() response: Response,
@Next() next: NextFunction,
) {
const BUILD_DIR = path.join(process.cwd(), 'build');
const env = process.env.NODE_ENV;
if (env === 'production') {
createRequestHandler({ build: require(BUILD_DIR), mode: env })(
request,
response,
next,
);
} else {
for (const key in require.cache) {
if (key.startsWith(BUILD_DIR)) {
delete require.cache[key];
}
}
const requestHandler = createRequestHandler({
build: require(BUILD_DIR),
mode: env,
});
requestHandler(request, response, next);
}
}
}
import { Module } from '@nestjs/common';
import { RemixController } from './remix.controller';
@Module({
imports: [],
controllers: [RemixController],
providers: [],
})
export class RemixModule {}
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { RemixModule } from './remix/remix.module';
@Module({
imports: [RemixModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}