typescript - Problema de enrutamiento al usar contenido estático (Angular 8) con NestJS y Fastify
He estado buscando durante los últimos días una manera de solucionar un problema de enrutamiento al usar contenido estático con NestJS y Fastify. Específicamente, estoy tratando de usar Angular 8 alojado por NestJS con Fastify detrás del telón. He estado siguiendo el ejemplo dado en el tutorial: https://www.djamware.com/post/5d2898430707cc5968d9d57f/build-a-web-app-using-nestjs-fastify-mongodb-and-angular-8
El problema es que si intentas navegar directamente a una URL específica, como http://localhost:3000/articles, el servidor Fastify responde con una cadena JSON que contiene un mensaje de error 404. He reducido el problema a algo específicamente problemático con Fastify al clonar el repositorio de GitHub del tutorial y no hacer nada más que lo requerido para reemplazar Fastify con Express, lo cual sí funciona.
Estoy publicando mi código con la esperanza de que alguien pueda decirme qué estoy haciendo mal. Me gustaría usar Fastify en lugar de Express, porque si las afirmaciones sobre la velocidad son precisas, realmente podría aprovechar el rendimiento aumentado. He dejado el código comentado que usé para cambiar el proyecto de Express. Gracias a cualquiera que se tome el tiempo de revisar esto e incluso tratar de ayudar.
EDITAR: Acabo de darme cuenta de que olvidé proporcionar un enlace al repositorio de GitHub, aquí está: https://github.com/didinj/nestjs-fastify-mongodb-angular8.git
principal.ts
import { NestFactory } from '@nestjs/core';
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
import { AppModule } from './app.module';
import { join } from 'path';
async function bootstrap() {
// const app = await NestFactory.create(AppModule);
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter({
wildcard: false,
logger: {
level: 'trace',
file: '/Users/jcorekin/fastify.log' // Will use pino.destination()
}
}),
);
app.useStaticAssets({
root: join(__dirname, '../client/dist/
});
await app.listen(3000, '0.0.0.0');
}
bootstrap();
app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ArticleModule } from './article/article.module';
import { ServeStaticModule } from '@nestjs/serve-static';
import { join } from 'path';
@Module({
imports:
[
// ArticleModule,
// ServeStaticModule.forRoot({
// rootPath: join(__dirname, '../client/dist/client'),
// }),
],
// controllers: [AppController],
providers: [AppService],
})
export class AppModule { }
app.servicio.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
Respuesta #1
Encontré una solución, pero molesta, requiere reemplazar Fastify con Express. Parece que Fastify tiene algunos problemas con el enrutamiento.
principal.ts
import { NestExpressApplication } from '@nestjs/platform-express';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(AppModule);
app.setGlobalPrefix('api');
await app.listen(3000);
}
bootstrap();
app.module.ts
import { CommentModule } from './comment/comment.module';
import { Module, HttpModule } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ProfessorModule } from './professor/professor.module';
import { ServeStaticModule } from '@nestjs/serve-static';
import { join } from 'path';
@Module({
imports: [
ServeStaticModule.forRoot({
rootPath: join(__dirname, '..', '..', 'client/dist/client'),
}),
HttpModule,
...
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule { }
Realmente quería mantener Fastify, pero pasé todo el día tratando de averiguar por qué el enrutamiento estaba roto, cuando podría simplemente cambiar a Express y funciona perfectamente.
También admitiré que no probé esta solución exacta con fastify, así que puede que funcione con fastify, si simplemente mantienes el código antiguo de creación de la aplicación fastify, te deshaces de esa extraña llamada "useStaticAssets" y solo usas serve-static en app.module.ts
