当前位置: 首页 > news >正文

好看的手机网站推荐广州网站建设商家

好看的手机网站推荐,广州网站建设商家,哪些网站是用响应式做的,滨州五学一做考试网站认识中间件-以及两个简单的示例 什么是中间件一个响应处理中间件老朋友 nest g如何使用为某个module引入全局引入 编写逻辑 一个日志中间件nest g mi 生成引入思考 代码进度 什么是中间件 官方文档 中间件是在路由处理程序之前调用的函数。中间件函数可以访问请求和响应对象&…

认识中间件-以及两个简单的示例

  • 什么是中间件
    • 一个响应处理中间件
      • 老朋友 nest g
      • 如何使用
        • 为某个module引入
        • 全局引入
      • 编写逻辑
    • 一个日志中间件
      • nest g mi 生成
      • 引入
      • 思考
    • 代码进度

什么是中间件

官方文档

中间件是在路由处理程序之前调用的函数。中间件函数可以访问请求和响应对象,以及next()应用程序请求-响应周期中的中间件函数。下一个中间件函数通常用名为 的变量表示next。类似于express的中间件。
官方文档也说了。
在这里插入图片描述
多说无益,我们来讲如何写中间件以及如何使用中间件。

一个响应处理中间件

这是我们之前的一个Post请求

在这里插入图片描述
可以看到,响应直接就是name了,正常情况下,我们需要包装一下,比如套个data加个code和message等等。当然,我们可以新建一个响应体类来处理好比如下代码,这里我们不用,我们用中间件来实现。

export default class ResObj {code: number;data: any;msg: string;constructor(code: number, data: any, msg: string) {this.code = code;this.data = data;this.msg = msg;}
}

老朋友 nest g

我们可以使用nest g 来帮我们生成一个中间件。

在这里插入图片描述
首先进入到apps/demo/src目录下

nest g mi response 

在这里插入图片描述
指令帮我们创建的也许没有类型定义,去官方爬一份。

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';@Injectable()
export class ResponseMiddleware implements NestMiddleware {use(req: Request, res: Response, next: NextFunction) {next();}
}

如何使用

我们新建了一个中间件,但是没有写逻辑,我们先来引入下,这样可以直观的看数据。

为某个module引入

中间件可以单为某一个模块使用。
这里以demo2模块为例子

import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { Demo2Service } from './demo2.service';
import { Demo2Controller } from './demo2.controller';
import { ResponseMiddleware } from '../response/response.middleware';@Module({controllers: [Demo2Controller],providers: [Demo2Service],
})
export class Demo2Module implements NestModule {configure(consumer: MiddlewareConsumer) {consumer.apply(ResponseMiddleware).forRoutes(Demo2Controller);}
}

在这里插入图片描述

主要代码在这里,为了有代码提示,我们implements NestModule
如果你的编辑器有代码提示,这些输入几个字母就出现了。这里就为某个模块引入成功了。如果有多个中间件怎么办。

consumer.apply(middle1, middl12,
middle3()// 如果你是函数式写法
).forRoutes(CatsController);
// 可以使用 forRoutes(“*”) 对模块下所有控制器

这里的forRoutes可以不为整个controller。可以排除一些,也可以只写入固定。
在这里插入图片描述
在这里插入图片描述
其他详情,看文档

全局引入

use()
在这里插入图片描述

编写逻辑

我们这里把next()注释掉,不执行,会发生什么呢
在这里插入图片描述
请求会被挂起。
在这里插入图片描述

在这里插入图片描述

去掉注释,将全局引入的注释掉,只用模块内引入,我们来编写逻辑,实现响应的格式化。
这里做了简单的处理,没有处理异常。后面我们会用其他基础构件来实现响应的处理。

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';function isJson(str: string) {try {JSON.parse(str);} catch (e) {return false;}return true;
}@Injectable()
export class ResponseMiddleware implements NestMiddleware {use(req: Request, res: Response, next: NextFunction) {const originalSend = res.send;res.send = function (body) {const newBody = {code: 200,message: 'Success',data: isJson(body) ? JSON.parse(body) : body,};return originalSend.call(this, JSON.stringify(newBody));};next();}
}

此时我们再次请求
在这里插入图片描述
当然我们除了处理响应,还可以处理请求。
比如我们这里加个。
在这里插入图片描述
在这里插入图片描述
这样是不推荐的,除非你有对应的取参数处理方法。不然你这里读取的就有问题,类型也不对了。

在这里插入图片描述
在这里插入图片描述

一个日志中间件

nest g mi 生成

我们同样在apps/demo/src下生成
在这里插入图片描述

nest g mi logger

引入

export class Demo2Module implements NestModule {configure(consumer: MiddlewareConsumer) {consumer.apply(ResponseMiddleware, LoggerMiddleware).forRoutes(Demo2Controller);}
}

逻辑类似于上面的响应处理,我们获取了请求的参数,这里Log了部分,其实可以将打印的东西打印到文件,接入fs或者用logger相关的库,来帮我们实现。这里只做中间件的简单演示,后面在实战中会进一步的熟悉。

import { Injectable, Logger, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';@Injectable()
export class LoggerMiddleware implements NestMiddleware {use(req: Request, res: Response, next: NextFunction) {const time = new Date().getTime();Logger.log(`${time}:[${req.method}] -req- ${req.url} -body: ${JSON.stringify(req.body)}`);const originalSend = res.send;res.send = function (body) {Logger.log(`${time}:[${req.method}] -res- ${req.url} -data: ${JSON.stringify(body)}`);return originalSend.call(this, body);};next();}
}

在这里插入图片描述

思考

可以看到我们这里打印的不是上个中间件的处理结果,上个中间件明明我们逃了一层code和data。为什么呢?
那如果我们换下中间件的引入顺序呢。改成如下
在这里插入图片描述
可以看到这次打印的是之前的响应中间件处理后的数据。

当请求抵达应用时,它会按照中间件在 apply 方法里的顺序依次通过各个中间件。每个中间件在处理完请求后,若调用了 next() 函数,就会把控制权传递给下一个中间件或者控制器;若没有调用 next() 函数,请求处理流程就会在此中断。

当控制器处理完请求并返回响应时,响应会反向通过中间件,即最后一个中间件先处理响应,接着是倒数第二个,依此类推。

代码进度

仓库

http://www.dtcms.com/a/599107.html

相关文章:

  • 电商网站建设小强wordpress上传失败
  • 装饰工程设计东莞网站建设展示型网站设计与制作团队
  • OpenRefine:一款免费开源、功能强大的数据清洗工具
  • 工控人如何做自己的网站运动网站建设主题
  • TensorRT笔记(2):解析样例中Logger日志类的设计
  • 南京领动做网站怎么样佛山制作网站公司推荐
  • 苏州建网站哪个好做定制的网站
  • 江苏网站建设流程朔州市建设监理公司网站
  • AI销冠是什么?熊猫智汇公司如何利用它提升企业效率?
  • 并发编程 | 提高程序效率的关键技术
  • 电子商务网站建设 项目规划书iis网站
  • 网站规划与建设实验心得企业网络营销策划必须以什么为核心
  • Bash Glob 通配符详细指南:从 POSIX 标准到高级用法
  • 景观设计论文seo关键词优化排名推广
  • 小米手机网站的风格设计莱州教育网站
  • 上海自适应网站设计网络营销策划书实施计划
  • 自己怎做网站后台正规医院看男科大概多少钱
  • NebulaChat 框架学习笔记
  • 网站规划建设方案模板网站建设和美工
  • 怎样用自己电脑做网站c2c电子商务平台有哪些?
  • 专业设计网站有哪些建设部的官方网站
  • CottonCloudsProcreate软笔刷套装打造柔和棉云质感日漫风插画创作资源
  • 山儿网站建设公司小程序 制作公司
  • 做暧昧网站无锡做网站的企业
  • 中堂做网站wordpress下载软件
  • 天津微外卖网站建设郑州大型网站建设电话
  • 《编程工具上架应用商店的避坑+引流全攻略》
  • 淮安网站网站建设京津冀协同发展10周年
  • 如何制作一个网站网站建设完整代码
  • 网站群建设规划方案wordpress同步微博插件