基于ts的node框架,nestjs基础

269 阅读6分钟

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基本操作

项目架构:

  1. package.json 存放依赖目录和基本指令
  2. 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 配置静态资源

  1. 首先引入NestExpressApplication平台

  2. 作为泛型传入create函数

    const app = await NestFactory.create<NestExpressApplication>(AppModule);
    
  3. 配置路径

      // 直接开放公共资源路径 访问方式: 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'
    }

img

六 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