NestJS 介绍

297 阅读5分钟

NestJS 环境搭建 、创建运行 NestJS 项目

1、电脑上面必须安装 nodejs 环境,推荐安装 nodejs 最新稳定版本

2、安装 Nest CLI 以及使用 Nest CLI 创建项目

安装 Nest CLI:

npm i -g @nestjs/cli

或者 cnpm i -g @nestjs/cli 或者 yarn global add @nestjs/cli

使用 Nest CLI 创建项目:

nest new nestdemo

NestJS 中的控制器

Nest 中的控制器层负责处理传入的请求, 并返回对客户端的响应

控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,

每个控制器有多个路由,不同的路由可以执行不同的操作

可以通过 NestCLi 创建控制器:

nest g controller news

热更新 npm run start:dev

main.js -- app.module.ts app.controller.ts app.service.ts

// 路由
  @Get('news')
  getNews():string{
    //return  '这是 nest里面自定义的方法 页面 路由';
    return this.appService.getProduct();
  }
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return '你好 222';
  }

  getProduct():string{
    return '这是路由控制器';
  }
}

image.png

image.png

NestJS 中的路由

Nestjs 中没有单独配置路由的地方。定义好控制器后 nestjs 会自动给我们配置对应的路由。

下面代码定义了一个新闻控制器。装饰器为@Controller('article'),装饰器参数里面的'article'

就是我们的路由。

如果我们要返回 index 方法里面的内容我们在浏览器输入 http://localhost:3000/article

如果我们要返回 add 方法里面的内容我们在浏览器输入 http://localhost:3000/article/add

import { Controller, Get } from '@nestjs/common';

@Controller('article')

export class ArticleController {

@Get()

index(): string {

return ‘这是 article 里面的 index’;

}

@Get(‘add’)

add(): string {

return ‘这是 article 里面的 index’;

}

}

NestJS 中的 Get Post 以及通过方法参数装饰器获取传值

1、首先看一个 Get Post 请求的例子,注意我们使用 nestjs 内置装饰器的时候必须得在

@nestjs/common 模块下面引入对应的装饰器。

image.png

Nestjs 也提供了其他 HTTP 请求方法的装饰器 @Put() 、@Delete()、@Patch()、

@Options()、 @Head()和 @All()

Nestjs 中获取请求参数

在 Nestjs 中获取 Get 传值或者 Post 提交的数据的话我们可以使用 Nestjs 中的装饰器来获取。

image.png

`

import { Controller,Get,Post, Query,Body,Param,Request } from '@nestjs/common';
// 装饰器
@Controller('artcle')
export class ArtcleController {
    // 配置路由

    // http://localhost:3000/artcle
    @Get()
    index(){
        return '我是一个文章页面'
    }

    @Post()
    create():string{
        return 'this action adds a new cat'
    }

    // nestjs中获取请求参数
    // http://localhost:3000/artcle/about?id=123&name=xiaoming  
    @Get('about')
    getAbout(@Query() query):string{
        console.log(query)  // { id: '123', name: 'xiaoming' }
        return query
    }
// http://localhost:3000/artcle/list?id=999
    @Get('list')
    getNews(@Query('id') query):string{
        console.log(query) // 这里获取的就是get传值里面的id的值  999
        return query
    }

    // http://localhost:3000/artcle/edit?id=123&name=xiaoming
    // { id: '123', name: 'xiaoming' }
    @Get('edit')
    editData(@Request() req){
        console.log(req.query)
        return '通过reque获取get传值'
    }

    // http://localhost:3000/artcle/doAdd
    /**
     * 
     * @param newsData 
     * body json
     * {"data":"546546"}
     * @returns 
     */
    @Post('doAdd')
    async addNews(@Body() newsData){
        console.log(newsData)  // {"data":"546546"}
        return '增加新闻';
    }


    //动态路由
    // http://localhost:3000/artcle/123
    @Get(":id")
    findOne(@Param() params):string{
        console.log(params.id);//123
        return `this action return a ${params.id} cat`;

    }
}

Nestjs 中使用模板引擎和配置静态资源

image.png

在根目录新建 public 目录,然后在目录里面保存一个图片比如 1.jpg,这样就可以通过

http://localhost:3000/1.jpg 来访问图片。

image.png

NestJS 中配置模板引擎

1、安装对应的模板引擎 比如 ejs

cnpm i ejs --save

2、配置模板引擎

app.setBaseViewsDir(join(__dirname, '..', 'views')) // 放视图的文件

app.setViewEngine('ejs');

image.png

image.png

NestJS 中模板引擎结合 Post 演示、以及路由跳转

image.png

Nestjs 中的服务

关于 NestJS 中的服务

Nestjs 中的服务可以是 service 也可以是 provider。他们都可以通过 constructor 注 入依赖关系。服务本质上就是通过@Injectable() 装饰器注解的类。在 Nestjs 中服务相当于 MVC 的 Model。

NestJS 中创建和使用服务

1、创建服务 nest g service 模块名

image.png

image.png

image.png

image.png

Nestjs 中的 Cookie

HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页

面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何

关系的。如果我们要实现多个页面之间共享数据的话我们就可以使用 Cookie 或者 Session 实

● cookie 是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域

名的时候共享数据

Nestjs 中使用 Cookie

NestJs 中使用 Cookie 的话我们可以用 cookie-parser 来实现。

docs.nestjs.com/techniques/…

1.安装

cnpm instlal cookie-parser --save

npm i -D @types/cookie-parser

image.png

image.png

属性说明:

domain: 域名

expires : 过 期 时 间 ( 秒 ) , 在 设 置 的 某 个 时 间 点 后 该 Cookie 就 会 失 效 , 如

expires=Wednesday, 09-Nov-99 23:12:40 GMT

maxAge: 最大失效时间(毫秒),设置在多少后失效

secure: 当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效

path: 表示 cookie 影响到的路,如 path=/。如果路径不能匹配时,浏览器则不发送这

个 Cookie

httpOnly:是微软对 COOKIE 做的扩展。如果在 COOKIE 中设置了“httpOnly”属性,则通

过程序(JS 脚本、applet 等)将无法读取到 COOKIE 信息,防止 XSS 攻击产生

signed : 表 示 是 否 签 名 cookie, 设 为 true 会 对 这 个 cookie 签 名 , 这 样 就 需 要 用

res.signedCookies 而不是 res.cookies 访问它。被篡改的签名 cookie 会被服务器拒绝,并且

cookie 值会重置为它的原始值

image.png

获取 cookie req.cookies.属性名

删除 cookie res.cookie('rememberme', '', { expires: new Date(0)});

res.cookie('username','zhangsan',{domain:'.ccc.com',maxAge:0,httpOnly:true});

Nestjs 中 Session 的使用

session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存

在服务器上。

Session 的工作流程

当浏览器访问服务器并发送第一次请求时,服务器端会创建一个 session 对象,生成一个类似于key,value 的键值对,然后将 key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带 key(cookie),找到对应的 session(value)。 客户的信息都保存在 session 中

Nestjs 中 express-session 的使用: 1、安装 express-session npm i express-session --save npm i -D @types/express-session --save

2、引入 express-session

import * as session from 'express-session';

  1. 设置官方文档提供的中间件

app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))

  1. 使用 设置值 req.session.username = "张三";

获取值 req.session.username

image.png

image.png

五、 express-session 的常用方法:

image.png