1.静态文件服务
Nestjs作为一个完整的后端服务器框架,除了响应HTTP请求提供Web服务外,也可以用作静态文件服务器,以提供打包好的前端文件。虽然在实际项目中,更推荐使用nginx
或者apache
一类专用的服务器引擎来提供静态文件,但对于小型项目来说,将静态文件部署在Nestjs可以减少项目的复杂性(比如前端路由或者跨域请求等问题)。
在Nestjs中,静态文件通过@nestja/serve-static
中的ServeStaticModule
模块实现。通过如下命令安装:
npm install --save @nestjs/serve-static
按照官方文档的指引,在根模块AppModule
中引入ServeStaticModule
模块并使用forRoot()
方法启用:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ServeStaticModule } from '@nestjs/serve-static';
import { join } from 'path';
@Module({
imports: [
ServeStaticModule.forRoot({
rootPath: join(__dirname, '..', 'client'),
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
在rootPath
属性中指定静态文件的路径,需要注意的是,这里使用了nodejs
中的path
模块及其join
方法,以及nodejs
内置的变量__dirname
参数来指定项目根目录。在本例中,client
文件夹位于项目根目录下(和src
目录处于同一层)。
官方文档中同样提供了一个示例项目来说明静态文件的部署位置和访问方法。在client
文件夹下新建一个index.html
文件并且写入下列内容:
<img src="/logo.svg" width="100" />
<h1>Static website</h1>
<ul>
<li><a href="/hd.txt">Link 1</a></li>
<li><a href="/link-2">Link 2</a></li>
<li><a href="/link-3">Link 3</a></li>
</ul>
在文件夹下新建一个logo.svg
图片文件以及hd.txt
文件并在其中写入hello world
等内容。如果运行项目包含官方示例中Cat
类的项目,可以看出,在访问/api/cat
时服务器返回api响应。而在访问根路径或者/index.html
时则会返回client目录下的静态文件。
2. 全局前缀
可以通过INestApplication
中的setGlobalPrefix()
方法配置api的全局前缀。如下使用后,会全局添加v1前缀。
const app = await NestFactory.create(AppModule);
app.setGlobalPrefix('v1');
如果api
使用swagger
生成api,要避免全局前缀的影响,可以使用ignoreGlobalPrefix
来忽略全局前缀,例如:
const document = SwaggerModule.createDocument(app, options, {
ignoreGlobalPrefix: true,
});
在swagger
中也可以使用模块的setup方法来设置api前缀,例如:
SwaggerModule.setup('api', app, document);
3. 混合应用
除了标准的Http请求外,Nestjs也支持不同类型的微服务例如WebSocket
等,使用INestApplication
中的connectMicroservice()
来连接INestMicroservice
。
在官方文档中创建了一个微服务案例并使用connectMicroservice()
方法进行连接:
const app = await NestFactory.create(AppModule);
const microservice = app.connectMicroservice({
transport: Transport.TCP,
});
await app.startAllMicroservicesAsync();
await app.listen(3001);
const app = await NestFactory.create(AppModule);
// microservice #1
const microserviceTcp = app.connectMicroservice<MicroserviceOptions>({
transport: Transport.TCP,
options: {
port: 3001,
},
});
// microservice #2
const microserviceRedis = app.connectMicroservice<MicroserviceOptions>({
transport: Transport.REDIS,
options: {
url: 'redis://localhost:6379',
},
});
await app.startAllMicroservicesAsync();
await app.listen(3001);
4. HTTPS协议
https可以用来加强网络安全性,在chrome
等主流浏览器中,仍然使用http
协议的网站会被标注为不安全以提醒用户。在nestjs中,同样提供了对https协议的支持。在生产环境中,应该向信任的https证书颁发机构申请证书并安装在自己的网站中,而对于测试项目或者内部项目,也可以通过openssl等方法来自动生成并颁发证书。
以Ubuntu系统为例,在项目根目录下新建secret
文件夹并在其中使用OpenSSL
来生成密钥对的方法如下:
sudo apt-get install openssl //安装openssl
openssl //进入openssl程序
openssl genrsa -out private-key.pem 2048 //生成密钥文件 private-key.pem
openssl rsa -in private-key.pem -pubout -out public-certificate.pem //根据该密钥文件生成公钥文件
使用httpsOptions
属性来设置https
服务器:
const httpsOptions = {
key: fs.readFileSync('./secrets/private-key.pem'),
//如果使用该路径无效,可以参见前节的path和join方法
cert: fs.readFileSync('./secrets/public-certificate.pem'),
};
const app = await NestFactory.create(ApplicationModule, {
httpsOptions,
});
await app.listen(3000);
也可以使用多个服务器来分别支持http和https服务,官方的示例文档如下:
onst httpsOptions = {
key: fs.readFileSync('./secrets/private-key.pem'),
cert: fs.readFileSync('./secrets/public-certificate.pem'),
};
const server = express();
const app = await NestFactory.create(
ApplicationModule,
new ExpressAdapter(server),
);
await app.init();
http.createServer(server).listen(3000);
https.createServer(httpsOptions, server).listen(443);