1.静态文件服务

Nestjs作为一个完整的后端服务器框架,除了响应HTTP请求提供Web服务外,也可以用作静态文件服务器,以提供打包好的前端文件。虽然在实际项目中,更推荐使用nginx或者apache一类专用的服务器引擎来提供静态文件,但对于小型项目来说,将静态文件部署在Nestjs可以减少项目的复杂性(比如前端路由或者跨域请求等问题)。

在Nestjs中,静态文件通过@nestja/serve-static中的ServeStaticModule模块实现。通过如下命令安装:

  1. npm install --save @nestjs/serve-static

按照官方文档的指引,在根模块AppModule中引入ServeStaticModule模块并使用forRoot()方法启用:

  1. import { Module } from '@nestjs/common';
  2. import { AppController } from './app.controller';
  3. import { AppService } from './app.service';
  4. import { ServeStaticModule } from '@nestjs/serve-static';
  5. import { join } from 'path';
  6. @Module({
  7. imports: [
  8. ServeStaticModule.forRoot({
  9. rootPath: join(__dirname, '..', 'client'),
  10. }),
  11. ],
  12. controllers: [AppController],
  13. providers: [AppService],
  14. })
  15. export class AppModule {}

rootPath属性中指定静态文件的路径,需要注意的是,这里使用了nodejs中的path模块及其join方法,以及nodejs内置的变量__dirname参数来指定项目根目录。在本例中,client文件夹位于项目根目录下(和src目录处于同一层)。
官方文档中同样提供了一个示例项目来说明静态文件的部署位置和访问方法。在client文件夹下新建一个index.html文件并且写入下列内容:

  1. <img src="/logo.svg" width="100" />
  2. <h1>Static website</h1>
  3. <ul>
  4. <li><a href="/hd.txt">Link 1</a></li>
  5. <li><a href="/link-2">Link 2</a></li>
  6. <li><a href="/link-3">Link 3</a></li>
  7. </ul>

在文件夹下新建一个logo.svg图片文件以及hd.txt文件并在其中写入hello world等内容。如果运行项目包含官方示例中Cat类的项目,可以看出,在访问/api/cat时服务器返回api响应。而在访问根路径或者/index.html时则会返回client目录下的静态文件。

2. 全局前缀

可以通过INestApplication中的setGlobalPrefix()方法配置api的全局前缀。如下使用后,会全局添加v1前缀。

  1. const app = await NestFactory.create(AppModule);
  2. app.setGlobalPrefix('v1');

如果api使用swagger生成api,要避免全局前缀的影响,可以使用ignoreGlobalPrefix来忽略全局前缀,例如:

  1. const document = SwaggerModule.createDocument(app, options, {
  2. ignoreGlobalPrefix: true,
  3. });

swagger中也可以使用模块的setup方法来设置api前缀,例如:

  1. SwaggerModule.setup('api', app, document);

3. 混合应用

除了标准的Http请求外,Nestjs也支持不同类型的微服务例如WebSocket等,使用INestApplication中的connectMicroservice()来连接INestMicroservice

在官方文档中创建了一个微服务案例并使用connectMicroservice()方法进行连接:

  1. const app = await NestFactory.create(AppModule);
  2. const microservice = app.connectMicroservice({
  3. transport: Transport.TCP,
  4. });
  5. await app.startAllMicroservicesAsync();
  6. await app.listen(3001);
  1. const app = await NestFactory.create(AppModule);
  2. // microservice #1
  3. const microserviceTcp = app.connectMicroservice<MicroserviceOptions>({
  4. transport: Transport.TCP,
  5. options: {
  6. port: 3001,
  7. },
  8. });
  9. // microservice #2
  10. const microserviceRedis = app.connectMicroservice<MicroserviceOptions>({
  11. transport: Transport.REDIS,
  12. options: {
  13. url: 'redis://localhost:6379',
  14. },
  15. });
  16. await app.startAllMicroservicesAsync();
  17. await app.listen(3001);

4. HTTPS协议

https可以用来加强网络安全性,在chrome等主流浏览器中,仍然使用http协议的网站会被标注为不安全以提醒用户。在nestjs中,同样提供了对https协议的支持。在生产环境中,应该向信任的https证书颁发机构申请证书并安装在自己的网站中,而对于测试项目或者内部项目,也可以通过openssl等方法来自动生成并颁发证书。

以Ubuntu系统为例,在项目根目录下新建secret文件夹并在其中使用OpenSSL来生成密钥对的方法如下:

  1. sudo apt-get install openssl //安装openssl
  2. openssl //进入openssl程序
  3. openssl genrsa -out private-key.pem 2048 //生成密钥文件 private-key.pem
  4. openssl rsa -in private-key.pem -pubout -out public-certificate.pem //根据该密钥文件生成公钥文件

使用httpsOptions属性来设置https服务器:

  1. const httpsOptions = {
  2. key: fs.readFileSync('./secrets/private-key.pem'),
  3. //如果使用该路径无效,可以参见前节的path和join方法
  4. cert: fs.readFileSync('./secrets/public-certificate.pem'),
  5. };
  6. const app = await NestFactory.create(ApplicationModule, {
  7. httpsOptions,
  8. });
  9. await app.listen(3000);

也可以使用多个服务器来分别支持http和https服务,官方的示例文档如下:

  1. onst httpsOptions = {
  2. key: fs.readFileSync('./secrets/private-key.pem'),
  3. cert: fs.readFileSync('./secrets/public-certificate.pem'),
  4. };
  5. const server = express();
  6. const app = await NestFactory.create(
  7. ApplicationModule,
  8. new ExpressAdapter(server),
  9. );
  10. await app.init();
  11. http.createServer(server).listen(3000);
  12. https.createServer(httpsOptions, server).listen(443);