main.js
应用程序入口文件。它使用 NestFactory
用来创建 Nest 应用实例。
create()方法:从下图可以看出,create有两个,一个接受根模块和可选配置对象,另一个则接受根模块、代理请求/响应周期的适配器、可选的配置对象
拓展:
方法重载:定义的两个方法重名,那么只要形参的个数或者类型不一致,那么就会被认为是两个不同的函数,根据不同的参数类型或个数来调用合适的方法,提高代码的复用性和灵活性,非弱类型的语言均可这么定义
强类型语言:强类型语言是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型了,强类型语言包括Java、.net 、Python、C++、typeScript等语言
弱类型语言:弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过显性强制转换。弱类型语言包括vb 、PHP、javascript等语言。
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
// 默认使用express平台
const app = await NestFactory.create(AppModule);
//访问的端口号
await app.listen(3000);
}
bootstrap();
如果想要切换成fastify平台,先安装fastify驱动
npm install fastify @nestjs/platform-fastify && npm uninstall @nestjs/platform-express @types/express
然后将main.js改成如下
import { NestFactory } from '@nestjs/core';
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
import { AppModule } from './app.module';
async function bootstrap() {
// 使用fastify驱动
const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter(), {
// 启用跨域访问
cors: true,
// 只使用error和warn这两种输出,避免在控制台冗余输出
logger: ['error', 'warn'],
});
// 设置全局访问前缀
app.setGlobalPrefix('api');
//访问的端口号
await app.listen(3000,()=>{
// 启动后的输出
console.log('访问路径为:http://localhost:3000/api');
});
}
bootstrap();
关于create的options参数
//跨域配置。可以设置true默认跨域,也可以设置CorsOptions对象,配置详细的CORS选项,例如允许共享本资源的Origin、允许的HTTP方法、允许请求携带哪些头部信息等等
cors?: boolean | CorsOptions | CorsOptionsDelegate<any>
//是否使用底层平台的body解析器,
bodyParser?: boolean
//配置HTTPS服务器的选项。可以设置为HttpsOptions对象,包含有关SSL证书、私钥等的详细信息。
httpsOptions?: HttpsOptions
//是否在请求上注册原始请求体。使用“req.rawBody”
rawBody?: boolean;
//强制关闭打开的HTTP连接
forceCloseConnections?: boolean;
//指定自定义的日志记录器,用于记录应用程序的日志。
logger?: LoggerService | LogLevel[] | false;
//它决定了当在启动过程中发生错误时是否要终止应用程序的启动。如果 abortOnError 设置为 true(默认值为 false),当发生错误时,Nest.js 会立即终止应用程序的启动,并输出错误信息。如果 abortOnError 设置为 false,则会继续启动应用程序,但会打印出错误信息。
abortOnError?: boolean | undefined;
//如果启用,日志将被缓冲,直到“Logger#flush”方法被调用。
bufferLogs?: boolean;
//如果启用,日志将自动刷新,并在应用程序初始化过程完成或失败
autoFlushLogs?: boolean;
//是否以预览模式运行应用程序。在预览模式下,提供商/控制器不会被实例化和解析。
preview?: boolean;
//是否生成序列化的图快照。
snapshot?: boolean;
改好了平台和配置就可以启动项目了
npm run start 如果需要热更新 npm run start:dev
在浏览器中访问locahost:3000,当然如果你在main.js中改了app.listen的端口号的话。那就是你改的端口号,就会看见'Hello World!',这个'Hello World!'就是你在app.controller.ts定义的Get请求的getHello方法中this.appService.getHello()返回的字符串
@Controller控制器,可以理解为路由,@Controller('路由路径')
代表访问这个控制器下的所有接口都要加上/路由路径
生成命令
可以通过nest --help查看nest命令列表
nest --help
│ name │ alias │ description │ │ application │ application │ Generate a new application workspace │
│ class │ cl │ Generate a new class │
│ configuration │ config │ Generate a CLI configuration file │
│ controller │ co │ Generate a controller declaration │
│ decorator │ d │ Generate a custom decorator │
│ filter │ f │ Generate a filter declaration │
│ gateway │ ga │ Generate a gateway declaration │
│ guard │ gu │ Generate a guard declaration │
│ interceptor │ itc │ Generate an interceptor declaration │
│ interface │ itf │ Generate an interface │
│ library │ lib │ Generate a new library within a monorepo │
│ middleware │ mi │ Generate a middleware declaration │
│ module │ mo │ Generate a module declaration │
│ pipe │ pi │ Generate a pipe declaration │
│ provider │ pr │ Generate a provider declaration │
│ resolver │ r │ Generate a GraphQL resolver declaration │
│ resource │ res │ Generate a new CRUD resource │
│ service │ s │ Generate a service declaration │
│ sub-app │ app │ Generate a new application within a monorepo │
1.生成controller.ts
生成content模块的controllers、server、module
nest g mo modules/content&&nest g s modules/content&&nest g co modules/content/controllers/posts --no-spec --flat
然后写几个请求,然后用postman测试一下,没有postman也没关系,可以下载个vscode插件Thunder Client,没错就是这个小闪电
import { Body, Controller, Delete, Get, Param, Patch, Post } from '@nestjs/common';
interface PostsEntity {
id: number;
title: string;
summary?: string;
body: string;
}
let posts: PostsEntity[] = [
{ id: 1, title: '标题1', body: '内容1' },
{ id: 2, title: '标题2', body: '内容2' },
{ id: 3, title: '标题3', body: '内容3' },
{ id: 4, title: '标题4', body: '内容4' },
{ id: 5, title: '标题5', body: '内容5' },
{ id: 6, title: '标题6', body: '内容6' },
];
@Controller('posts')
export class PostsController {
@Get() // 查询全部
async queryAll() {
return posts;
}
@Get(':id') // 查询单条 ':id'动态id
async queryOnce(@Param('id') id: number) {
// @Param(key?: string): 获取url中的params参数,比如 posts/1
return posts.find((v) => v.id === Number(id));
}
@Post() // 新增
async addPost(@Body() data: PostsEntity) {
// @Body() 获取请求体
const newPost: PostsEntity = { ...data, id: posts[posts.length - 1].id + 1 };
posts.push(newPost);
return posts;
}
@Patch(':id') // 更新部分数据
async upDate(@Param('id') id: number, @Body() data: PostsEntity) {
posts = posts.map((item) => (item.id === Number(id) ? { ...item, ...data } : item));
return posts;
}
@Delete(':id') // 删除
async delPost(@Param('id') id: number) {
console.log('id', id);
posts = posts.filter((v) => v.id !== Number(id));
return posts;
}
}
因为我在main.js中加了app.setGlobalPrefix('api');,所以地址是http://localhost:3000/api/posts