typescript - Problem s rutiranjem pri korištenju statičkog sadržaja (Angular 8) s NestJS i Fastify
Posljednjih nekoliko dana tražim način kako riješiti problem s usmjeravanjem prilikom korištenja statičkog sadržaja s NestJS-om i Fastifyjem. Konkretno, pokušavam koristiti Angular 8 koji hosta NestJS s Fastifyjem 'ispod haube'. Pratim primjer dan u tutorijalu: https://www.djamware.com/post/5d2898430707cc5968d9d57f/build-a-web-app-using-nestjs-fastify-mongodb-and-angular-8
Problem je u tome što, ako pokušate izravno navigirati na određeni URL, poput http://localhost:3000/articles, Fastify server odgovara JSON nizom koji sadrži poruku o pogrešci 404. Problem sam suzio na nešto specifično problematično s Fastifyjem tako što sam klonirao GitHub repozitorij tutorijala i nisam radio ništa više osim što je bilo potrebno da se Fastify zamijeni s Expressom, što radi.
Objavljujem svoj kod u nadi da mi netko može reći što radim pogrešno. Volio bih koristiti Fastify umjesto Expressa, jer ako su tvrdnje o brzini točne, stvarno bih mogao iskoristiti poboljšane performanse. Ostavio sam zakomentirani kod koji sam koristio za prebacivanje projekta s Expressa. Hvala svima koji odvoje vrijeme da to pregledaju i čak pokušaju pomoći.
UREDI: Upravo sam shvatio da sam zaboravio dati poveznicu na GitHub repozitorij, evo je: https://github.com/didinj/nestjs-fastify-mongodb-angular8.git
main.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.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
Odgovor #1
Pronašao sam rješenje, ali nezgodno je što zahtijeva zamjenu Fastifyja s Expressom. Čini se da Fastify ima problema s rutiranjem.
main.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 { }
Zaista sam želio zadržati Fastify, ali proveo sam cijeli dan danas pokušavajući shvatiti zašto je rutiranje pokvareno, kada bih jednostavno mogao prijeći na Express i sve radi savršeno!
Također ću priznati da nisam isprobao ovočno rješenje s Fastifyjem, pa možda radi s Fastifyjem, ako samo zadržite staru Fastify app kreaciju, uklonite taj čudan poziv "useStaticAssets" i jednostavno koristite serve-static u app.module.ts
