nestjs筆記
一 nest-cli
安装
npm install -g @nestjs/cli
cnpm install -g @nestjs/cli
yarn add global @nest/cli
常用命令
-- 获取帮助
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 │ in │ Generate an interceptor declaration │
│ interface │ interface │ Generate an interface │
│ 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 │
│ service │ s │ Generate a service declaration │
│ library │ lib │ Generate a new library within a monorepo │
│ sub-app │ app │ Generate a new application within a monorepo │
│ resource │ res │ Generate a new CRUD resource │
└───────────────┴─────────────┴──────────────────────────────────────────────┘
-- 创建新项目
nest new my-nest-project
cd my-nest-project
npm run start:dev
二 nestJs基本操作
项目架构:
- package.json 存放依赖目录和基本指令
- src:
- app.controller.spec.ts 测试文件用例
- app.controller.ts 控制器
- app.modules.ts 跟模块
- app.services.ts 服务模块
- mian.ts 入口文件,创建服务
2.1 控制器
nest中的控制器层负责处理传入的请求,并返回对客户端的响应
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
// 路由和基本路由操作
@Get()
getHello(): string {
return this.appService.getHello();
}
@Get('/news')
getNews(): String {
return 'news'
}
}
}
命令行创建控制器
nest g controller `控制器名`
example:
nest g controller artical
import { Controller, Get } from '@nestjs/common';
@Controller('artical')
export class ArticalController {
// 根据装饰器来查找相应路由函数,函数名不重要,可以随意写
// 当我们不在装饰器内写路由参数时,默认路径是Controller参数
// http://localhost:3000/artical
@Get()
index(): String{
return '文章页面'
}
// http://localhost:3000/artical/add
@Get('add')
add(): String {
return '新增文章'
}
}
2.2 获取请求参数
获取get请求参数 @Query() @Request()
import { Controller, Get, Query, Request } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get()
index(): String{
return '用户中心'
}
// 使用方法参数装饰器@query()获取get请求参数:
// http://localhost:3000/users/add?username=yanlifei&id=123
// { username: 'yanlifei', id: '123' }
@Get('addUser')
addUser(@Query() query): String{
console.log(query);
return query
}
// 可以在方法参数装饰器内带参用于直接获取参数数据
@Get('getUserBy')
getUserBy(@Query('id') id): String {
console.log(id); //123
return '获取用户'
}
// 使用@Request()获取get请求参数
// http://localhost:3000/users/add?username=yanlifei&id=123
@Get('editUser')
editUser(@Request() req): String{
return req.query
}
}
获取post请求参数: @Body()
// 获取post请求参数
@Post('register')
register(@Body() body): Object{
return {
status: 200,
msg: '注册用户',
userMsg: body
}
}
获取动态路由 @Param()
// 获取动态路由 http://localhost:3000/users/getUser/123
@Get('getUser/:id')
getUser(@Param() param:String): String{
return param // {id:123}
}
模糊匹配
// 路由匹配 模糊查询
@Get('mohu***')
mohu(): String{
return '模糊查询'
}
2.3 配置静态资源
-
首先引入
NestExpressApplication平台 -
作为泛型传入create函数
const app = await NestFactory.create<NestExpressApplication>(AppModule); -
配置路径
// 直接开放公共资源路径 访问方式: http://localhost:3000/11.jpg app.useStaticAssets('public') // 设置虚拟路径 访问方式: http://localhost:3000/static/11.jpg app.useStaticAssets(join(__dirname, '..', 'public'), { prefix: '/static/' })
2.4 配置模板引擎
安装模板引擎ejs
yarn add ejs
配置ejs
// 配置模板引擎资源路径
app.setBaseViewsDir(join(__dirname, '..', 'views'))
app.setViewEngine('ejs')
新建ejs文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1><%=message%></h1>
</body>
</html>
传递数据到ejs文件中
@Get()
@Render('default/index')
ejs(): Object{
return {
message:'我是ejs内容'
}
}
当我们向默认地址发起请求时,会渲染default/index模板引擎的内容,并且将返回值传到该引擎中,通过<%=message%>格式获取返回内容
三 nestJs中的服务
创建服务
nest g service `服务名`
nest g provider `服务名`
service用于处理数据返回给controller,让controller可以专注于请求响应
示例:
nest g services news
nest g controller news
news.services.ts 在这个文件内处理数据并返回
import { Injectable } from '@nestjs/common';
@Injectable()
export class NewsService {
findAllData() {
return [{
id: '123', name: 'yanlifei'
},{
id: '234', name: 'yanlifei'
},{
id: '345', name: 'yanlifei'
}]
}
}
news.controller.ts: 在这个文件内拿到处理过的数据直接做数据响应
import { Controller, Get } from '@nestjs/common';
import { NewsService } from './news.service';
@Controller('news')
export class NewsController {
constructor(private newsService: NewsService) { }
@Get('getdatas')
findData() {
return this.newsService.findAllData()
}
}
四 nestJs中的cookie
4.1cookie基本操作
NestJs中使用cookie我们可以使用cookie-parser来实现
安装:
yarn add cookie-parser
引入cookie-parser
import * as cookieParser from 'cookie-parser'
配置中间件 main.ts
app.use(cookieParser())
设置cookie
@Get('setcookie')
setcookie(@Response() res) {
// 参数username是key i am cookie是value
res.cookie('username', 'i am cookie', {
maxAge: 1000 * 60 * 10, //设置过期时间
httpOnly: true // 是否只有后端可以访问
})
res.send('这是返回值信息') //不可以使用return 否则会阻塞
}
获取cookie
// 获取cookie
// 通过请求数据 req.cookies.username来获取
@Get('cookie')
getCookie(@Request() req) {
console.log('req.cookie.username',req.cookies.username)
}
设置cookie时cookie-parser的option有以下选项:
| 配置 | 描述 |
|---|---|
| domain | 域名。设置子域名(二级域名)是否可以访问cookie。 例:domain:'.主域名' |
| expires | 过期时间(秒),在设置的某个时间点后该 Cookie 就会失效,如 expires=Wednesday, 09-Nov-99 23:12:40 GMT |
| maxAge | 最大失效时间(毫秒),设置在多少后失效 |
| secure | 当 secure 值为 true 时, cookie 在 HTTP 中是无效,在 HTTPS 中才有效 |
| path | 表示 cookie 影响到的路由,如 path=/。如果路径不能匹配时,浏览器则不发送这个 Cookie |
| httpOnly | 默认为false,建议设置为true, 客户端将无法通过document.cookie读取到 COOKIE 信息,可防止 XSS 攻击产生 |
| signed | 表示是否签名(加密) cookie, 设为 true 会对这个 cookie 签名,这样就需要用res.signedCookies 访问它,前提需要设置上面中间件app.use传参 ,未签名则用 res.cookies 访问 被篡改的签名 cookie 会被服务器拒绝,并且 cookie值会重置为它的原始值。 |
4.2 Cookie加密
设置密钥
app.use(cookieParser('这是一个密钥字符串'))
配置中的signed设为true
使用
*req*.signedCookies.username获取加密后的cookie数据
@Get('setcookie')
setcookie(@Response() res):void {
// 参数username是key i am cookie是value
res.cookie('username', 'i am cookie', {
maxAge: 1000 * 15, //设置过期时间
httpOnly: true, // 是否只有后端可以访问
signed: true //是否加密
})
res.send('这是返回值信息') //不可以使用return 否则会阻塞
}
// 获取cookie
// 通过请求数据 req.cookies.username来获取
@Get('cookie')
getCookie(@Request() req):void {
console.log('req.cookie.username',req.signedCookies.username)
}
五 NestJs中的session
cookie和session都是机录客户状态的机制,不同的是cookie保存在浏览器中,session保存在服务器上
session是基于cookie实现的
我们使用express-session来设置session
安装
yarn add express-session
引入
import * as session from 'express-session'
中间件
// 配置express-session中间件
app.use(session({
secret: '这是一个密钥字符串',
cookie: {
maxAge: 6000
}
}))
设置和获取session
// 设置session
@Get('setsession')
setSession(@Request() req) {
req.session.username = 'yanlifei'
return '设置session'
}
// 获取session
@Get('getsession')
getSession(@Request() req) {
console.log('req.session.username',req.session.username)
return '获取session'
}
六 nestjs中的模块
| providers | 由 Nest 注入器实例化的提供者,并且可以至少在整个模块中共享 |
| controllers | 必须创建的一组控制器 |
| imports | 导入模块的列表,这些模块导出了此模块中所需提供者 |
| exports | 由本模块提供并应在其他模块中可用的提供者的子集。 |
import { Module } from '@nestjs/common';
import { SequelizeModule } from '@nestjs/sequelize';
import { Song_list } from './song_list.model';
import { SongListController } from './song_list.controller';
import { SongListService } from './song_list.service';
@Golbal() //全局模块
@Module({
imports: [SequelizeModule.forFeature([Song_list])],//定义songListModel模块被注册到当前范围内
controllers: [SongListController],
providers: [SongListService],
exports: [SequelizeModule] //导出给其他模块可使用
})
export class SongListModule {}
生成一个module文件
nest g module users