Проблема с маршрутизацией при использовании статического содержимого (Angular 8) с NestJS и Fastify

Последние несколько дней я искал способ исправить проблему с маршрутизацией при использовании статического контента с NestJS и Fastify. В частности, я пытаюсь использовать Angular 8, размещенный на NestJS, с Fastify под капотом. Я следовал примеру, приведенному в руководстве: https://www.djamware.com/post/5d2898430707cc5968d9d57f/build-a-web-app-using-nestjs-fastify-mongodb-and-angular-8

Проблема в том, что если вы попытаетесь перейти непосредственно к определенному URL-адресу, например http://localhost:3000/articles, сервер Fastify отвечает строкой JSON, содержащей сообщение об ошибке 404. Я сузил проблему до чего-то особенно проблемного с Fastify, клонировав репозиторий GitHub из учебника и не делая ничего больше, чем требуется для замены Fastify на Express, что действительно работает.

Я публикую свой код в надежде, что кто-нибудь скажет мне, что я делаю не так. Я бы хотел использовать Fastify вместо Express, потому что, если заявления о скорости верны, я действительно мог бы использовать повышенную производительность. Я оставил закомментированный код, который я использовал для переключения проекта Express. Спасибо всем, кто нашел время, чтобы просмотреть это и даже попытаться помочь.

РЕДАКТИРОВАТЬ: Я только что понял, что забыл предоставить ссылку на репозиторий GitHub, вот она: 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!';
  }
}

person jcorekinASRC    schedule 13.11.2019    source источник
comment
Удалось ли вам найти решение этой проблемы? У меня такая же проблема.   -  person Adam Pine    schedule 19.02.2020


Ответы (1)


Я нашел решение, но, к сожалению, оно требует замены Fastify на Express. Похоже, что у Fastify есть проблемы с маршрутизацией.

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 { }

Я действительно хотел сохранить Fastify, но сегодня я потратил целый день, пытаясь понять, почему маршрутизация была нарушена, когда я мог просто переключиться на экспресс, и это отлично работает!

Я также признаю, что я не пробовал это точное решение с fastify, поэтому оно может работать с fastify, если вы просто сохраните старый код создания приложения fastify, избавитесь от этого странного вызова useStaticAssets и просто используйте serve-static на app.module.ts

person Adam Pine    schedule 19.02.2020
comment
Это действительно расстраивает, я также вынужден использовать экспресс вместо fastify. В моем случае маршрутизация будет работать локально, но не на экземпляре докера. - person fredtma; 18.08.2020