#使用脚手架搭建nest项目,学会controller的基础用法#
搭建项目
使用npm下载脚手架;
npm i -g @nestjs/cli
创建一个nest新项目;
nest new project-name
进入创建的文件夹,npm run start;能访问到localhost:3000则启动成功;
Npm run start
使用controller装饰器
创建一个控制器(类),如:user.controller.ts
// 如果想要使用命令创建,可以使用nest g controller user
import {
// 类装饰器
Controller,
// 方法装饰器
Get,HttpCode,Post,Header,Redirect,
// 参数装饰器
Req,Request,Param
} from '@nestjs/common';
import {Request as ExpressRequest} from 'express';
//控制器装饰器定义一个基本的控制器,我们可以通过在装饰器钟使用路径前缀对路由进行分组
@Controller('user')
export class UserController{
// 当我们使用Get()方法装饰器,我们可以在路由上定义一个get请求,这样他会和controller装饰器中定义的路径进行拼接 /user/get
@Get('get')
getUser():string{
/**
* 这里我们只是简单的返回一个字符串,因为会有状态码等响应:因为当返回值为一个基本类型时,nest内部会负责处理。
* 如果我们使用@Res()或者@Next(),则需要手动设置响应;
* 那如果我们只想修改响应的一部分,并不想完全自己设置,可以使用@Res({ passthrough: true })
* */
return 'getUser';
}
// Request()请求参数装饰器,其中Request和Req是等效的
@Get('request')
// 这里我们可以给request,req两个方法参数添加类型,需要安装@types/express
handleRequest(@Request() request:ExpressRequest,@Req() req:ExpressRequest):string{
// 获取request的全部信息
console.log("request",request);
// 获取req的url
console.log("req.url",req.url);
return 'handleRequest';
}
// POST()方法装饰器
@Post('post')
handlePost():string{
return 'handlePost';
}
/**
* 在nest里面除了Get,Post提供了很多请求类型的装饰器
* Put:用于更新资源,与post不同,Put是幂等的,即多次执行相同的操作,结果不变;
* Delete:删除资源,也是幂等的;
* Patch:更新资源,与Put不同,Patch是部分更新,即只更新资源的部分属性;
* Options:通常用于获取目标资源所支持的通信选项。常用于跨域资源共享(CORS)场景;
* Head:与 GET 类似,但不返回响应体。通常用于检查资源是否存在,而不获取其内容;
* All:允许一个路由处理程序同时处理多种 HTTP 方法。这在某些中间件或通用逻辑中非常有用。
*/
// 路由通配符 a*b
@Get('a*b')
handleWildCard(@Request() request:ExpressRequest):string{
return 'wildcard' + request.url;
}
// 状态码,使用HttpCode装饰器设置状态码
@Post('status')
@HttpCode(204)
handleHttpCode():string{
return 'status';
}
// Header,指定自定义像响应头,可以添加多个
@Post('header')
@Header('key1','value1')
@Header('key2','value2')
handleHeader():string{
return 'header';
}
// 重定向,将重新响应到指定的url,使用Redirect装饰器,它的两个参数(url,statusCode)
@Get('redirect1')
@Redirect('get',301)
handleRedirect():void{
console.log('handleRedirect');
// return 'redirect';
}
// 当然也可以动态传递路由,在返回值{url:url,statusCode:statusCode}可以覆盖Redirect参数,但是必需要Redirect装饰器
@Get('redirect2')
@Redirect('get',301)
handleRedirect2(@Request() request:ExpressRequest):any{
console.log('handleRedirect2');
// return 'redirect';
// 这里的url是动态的,可以动态获取
const url = "https://www.baidu.com";
// 这里的statusCode是动态的,可以动态获取
const statusCode = 301;
// 这里的redirectUrl是动态的,可以动态获取
const redirectUrl = 'get';
return {url:url,statusCode:statusCode}
}
// 获取路由参数
@Get('param/:id')
handleParam(@Param() params,@Param('id') id):string{
console.log('params',params);
return `id:${params.id}-----${id}`
}
}
在模块内的装饰里注册控制器
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { UserController } from './user.controller';
// import { AdminController } from './admin.controller';
import { AppService } from './app.service';
import { UserService } from './user.service';
import { BookController } from './book.controller';
@Module({
imports: [],
controllers: [AppController,UserController,BookController],
providers: [AppService,UserService],
})
export class AppModule {}