与NestJS和Fastify一起使用静态内容(Angular 8)时的路由问题
在过去的几天里,我一直在寻找一种方法来解决在NestJS和Fastify中使用静态内容时的路由问题。具体地说,我正在尝试使用NestJS托管的Angular 8和Fastify。我一直遵循教程中给出的示例: 问题是,如果您试图直接导航到特定的URL,例如,Fastify服务器将使用包含404错误消息的JSON字符串进行响应。通过克隆教程中的GitHub repo,我已经将问题缩小到Fastify的具体问题上,并且只做了用Express替换Fastify所需的工作,这确实有效 我张贴我的代码,希望有人能告诉我我做错了什么。我想用Fastify而不是Express,因为如果速度要求准确,我真的可以使用提高的性能。我留下了我用来切换Express项目的注释掉的代码。感谢所有花时间查看此信息甚至尝试提供帮助的人 编辑:我刚刚意识到我忘了提供GitHub回购的链接,这里是: 梅因酒店与NestJS和Fastify一起使用静态内容(Angular 8)时的路由问题,angular,typescript,routing,nestjs,fastify,Angular,Typescript,Routing,Nestjs,Fastify,在过去的几天里,我一直在寻找一种方法来解决在NestJS和Fastify中使用静态内容时的路由问题。具体地说,我正在尝试使用NestJS托管的Angular 8和Fastify。我一直遵循教程中给出的示例: 问题是,如果您试图直接导航到特定的URL,例如,Fastify服务器将使用包含404错误消息的JSON字符串进行响应。通过克隆教程中的GitHub repo,我已经将问题缩小到Fastify的具体问题上,并且只做了用Express替换Fastify所需的工作,这确实有效 我张贴我的代码,希望
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();
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.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
我找到了一个解决方案,但令人烦恼的是,它需要用Express替换Fastfy。Fastify似乎在路由方面存在一些问题 梅因酒店
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();
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();
我真的很想保持快速,但今天我花了一整天的时间试图弄清楚为什么路由被破坏了,当时我可以简单地换成express,它工作得非常完美
我还要承认,我没有在fastify上尝试这个精确的解决方案,所以它可能在fastify上工作,如果你只保留旧的fastify应用程序创建代码,摆脱那个奇怪的“useStaticAssets”调用,只在app.module.ts上使用serve static,你能找到这个问题的解决方案吗?我也有同样的问题。这真的很令人沮丧,我也被迫使用express而不是fastify。在我的例子中,路由将在本地工作,但不会在docker实例上工作。
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 { }
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 { }