node 中间件使用例子

NodeJS在中间件领域有着较为广泛的应用,他能做一些中间层事件,把服务端一部分的代码抽出来,减少处理冗余事情付出的代价,同时让服务真正做业务处理而不用关心页面的事情

常见的应用场景有:

  1. 跨域:解决跨域问题,前端不需要任何相关配置(当然这部分代码可以放在服务端)

  2. 数据mock:前后端同步开发(这没什么好说的)

  3. 接口整合或拆分:中间层的功能是作为后端接口与客户端界面之间的桥梁。前端首先向中间层发起请求,中间层根据业务逻辑向指定后端服务发起请求,后端返回数据后, 中间层根据前端所需的数据格式、种类进行排序筛选等整合封装,最后返回给前端。

  4.  代理:在开发环境下,可以利用Node.js代理,解决最常见的跨域问题;在线上环境下,我们可以利用代理,转发请求到多个服务端,起到类似于Nginx的负载均衡作用,且Node.js中可以很方便的根据业务架构编写转发逻辑代码,相对Ngnix更加灵活。

  5. 缓存:缓存其实是更靠近前端的需求,用户的动作触发数据的更新,Node.js中间层可以直接处理一部分缓存需求,在Redis中获取热点数据或临时数据。而不需要再去请求后端和数据库。 - 限流:Node.js中间层里,可以针对接口或者路由做响应的限流逻辑开发。

  6.  限流:Node.js中间层里,可以针对接口或者路由做响应的限流逻辑开发。

  7. 日志:相比其他服务端语言,Node.js中间层的日志记录,能更方便快捷的定位问题系统问题是后台服务还是前端问题。

  8. 监控:利用Node.js擅长高并发的请求处理的特性,可以用来做服务流量监控入口监控。

  9. 鉴权:微服务架构加可以将身份认证,权限校验的功能统一提前到中间层,不需要在每个服务里都对请求鉴权,降低代码冗余。此外也可以在Node.js中实现针对不同用户转发到不同后端服务的逻辑,这也是灰度发布的一种实现方式。

  10. 路由:前端更需要掌握页面路由的权限和逻辑,在中间层中对接口数据、路由整合转发,可以实现前端路由和请求接口路由的一致性,而后端服务接口路由可以独立设计,不需要迁就某个客户端所需的路由。

我写了一个demo加深理解,首先解释一下代码目录

代码地址:github地址

看app.js

日志中间件
// 日志中间件
app.use(async (ctx, next) => {const start = new Date();let ms;try {await next();ms = new Date() - start;logger.accessLog(ctx, ms);} catch (error) {ms = new Date() - start;logger.errorLog(ctx, error, ms);}
});

每次请求都会往文件输出一条日志方便查找错误,使用的是npm包---log4js,具体封装见/src/logs/logs.js

跨域中间件
// middlewares
app.use(KoaCors())
body解析中间件
//body解析中间件
app.use(bodyParser())
路由中间件
import KoaRouter from '@koa/router'
//路由中间间,routers 是导出的函数
app.use(router.routes()).use(router.allowedMethods());routers(router)

代码所有的目录入口都是index

import requireIndex from 'es6-requireindex'
import middleswares from '../middlewares';
const controller = require('../controllers');
const modulesFiles = requireIndex(__dirname).modules;
export default (router) => {Object.keys(modulesFiles).forEach((item) => {modulesFiles[item](router, middleswares, controller)})
}

目的是为了配合koa的洋葱模型,

举个例子:

 router.get('/department/list', middleswares.formatBody, controller.department.list);

在处理完路由之后先通过controller处理,然后执行formatBody,再把结果返回,所以写这个回调函数的时候要特别注意

/*** 响应数据格式化输出中间件* */module.exports = async (ctx, next) => {try {await next();//执行路由 这个next函数就是控制器函数,意思先执行处理逻辑,把结果根据自己的格式返回if (ctx.body) {ctx.body = {code: ctx.response.status,success: true,message: 'success',data: ctx.body}} else {ctx.body = {code: ctx.response.status,success: true,message: 'success',}}} catch (err) {console.log(err);ctx.response.status = err.response.status;ctx.body = {success: false,message: err.response.data.text,};}
}

不需要经过中间件处理的就写成这样就可以

  router.get('/user', controller.login.userInfo);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/27178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树左右树交换

leetcode 226题 翻转二叉树 题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3]…

背就有效!2024下《系统架构设计师》50个高频考点汇总

宝子们!上半年软考已经结束一段时间了,准备备考下半年软考高级-系统架构设计师的小伙伴可以开始准备了,毕竟高级科目的难度可是不低的,相信参加过上半年架构的小伙伴深有体会。 这里给大家整理了50个高频考点,涵盖全书…

node更改npm缓存存储位置-并配置环境变量

更改缓存位置 node安装完成之后,在安装目录中新建一个存放缓存的文件夹node_cache 此时这个文件夹必须使用管理员权限才能更改,这使得命令行下使用npm进行下载的时候总是报权限不足的错误:permit 解决办法: 右键 -> 属性 -> 安全 -> 编辑 -> 选择user -> …

【Linux】进程_3

文章目录 五、进程3. 进程4. 进程状态 未完待续 五、进程 3. 进程 在当前,我们只能通过执行可执行程序来让操作系统帮我们启动进程,那我们如何使用代码来自己启动进程呢?我们可以使用 fork() 函数。作用是创建子进程。 我们创建一个程序来…

字节扣子搭建大模型擂台:匿名PK效果,用户当裁判,跑分时代要结束了

字节跳动的扣子(coze.cn),给国产大模型们组了个大局—— 在同一个“擂台”上,两个大模型为一组,直接以匿名的方式PK效果! 例如我们对两位参赛“选手”同时提问今年高考的题目: 阅读下面的材料&…

探索数字化转型:提升企业客户服务竞争力的策略

当前,数字经济已成为引领经济发展的“主引擎”。在这一背景下,客户服务领域也在发生着深刻变化,传统的以客服热线、人工客服为核心的客户服务模式已不能满足企业发展的需要,而数字化转型成为企业寻求突破的必然选择。 企业可利用大…

elementui table超出两行显示...鼠标已入tip显示

elementui el-table超出两行显示…鼠标已入tip显示 方式一 <el-table-column label"描述"prop"note"class-name"myNoteBox"><template slot-scope"scope"><!-- tips悬浮提示 --><el-tooltip placement"to…

OpenAI把GPT-4原始版给了他们:研究不微调只靠提示词能走多远

除了OpenAI自己&#xff0c;居然还有别人能用上GPT-4-Base版&#xff1f;&#xff1f; 也就是未经微调的预训练版&#xff0c;还不会对话聊天&#xff0c;只会补全句子的模型。 EPFL&#xff08;瑞士洛桑联邦理工&#xff09;团队申请到了访问权限&#xff0c;用于研究**“上…

某文旅集团定岗定编项目成功案例纪实

——加强一专多能培训&#xff0c;增加人员履职&#xff0c;提高工作饱和度 【客户行业】文旅行业&#xff1b;国有企业 【问题类型】定岗定编 【客户背景】 北方某一线城市的文旅集团&#xff0c;是国资委下属的一家企业&#xff0c;主营业务包括&#xff1a;出租商业用房…

HCIE-QOS流量监管-拥塞管理

QOS流量监管-拥塞管理 QOS数据处理流程流量限速技术-令牌桶技术单桶单速双色标记法双桶单速三色标记法&#xff08;常用&#xff09;双桶双速三色标记法 流量监管承诺访问速率流量监管使用场景配置基于接口的流量监管配置MQC实现流量监管 流量整形流量整形的实现 (1)流量整形的…

【Python】Python开发面试题库:综合考察面试者能力

文章目录 Python开发面试题库&#xff1a;综合考察面试者能力1. 基础语法与数据类型问题1&#xff1a;变量与数据类型问题2&#xff1a;列表与字典操作问题3&#xff1a;字符串操作问题4&#xff1a;元组解包问题5&#xff1a;集合操作问题6&#xff1a;基本运算问题7&#xff…

LeetCode | 21.合并两个有序链表

这道题也是很经典的一道题了&#xff0c;408的算法题中也考过这个思想&#xff0c;因为两个链表已是升序&#xff0c;合并只需要两个指针&#xff0c;分别指向两个表的表头&#xff0c;分别比较两个指针所指向的结点的val&#xff0c;小的就插入到目标链表里面&#xff0c;再后…

鸿蒙轻内核Kconfig使用笔记

鸿蒙轻内核使用Kconfig进行图形化配置&#xff0c;本文专门讲解下鸿蒙轻内核LiteOS-M和LiteOS-A的图形化配置方法。本文中所涉及的源码&#xff0c;均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_a 、 https://gitee.com/openharmony/kernel_liteos_m 获取。本…

交友系统定制版源码 相亲交友小程序源码全开源可二开 打造独特的社交交友系统

交友系统源码的实现涉及到多个方面&#xff0c;包括前端页面设计、后端逻辑处理、数据库设计以及用户交互等。以下是一个简单的交友系统源码实现的基本框架和关键步骤: 1.数据库设计:用户表:存储用户基本信息&#xff0c;如用户ID、用户名、密码、头像、性别、年龄、地理位置…

深入解析 MySQL 事务:从基础概念到高级应用

深入解析 MySQL 事务&#xff1a;从基础概念到高级应用 一、定义 事务是由一个或多个 SQL 语句组成的独立工作单元&#xff0c;在这个单元中&#xff0c;每个 SQL 语句都是相互依赖的。事务作为一个不可分割的整体存在&#xff0c;要么全部成功&#xff0c;要么全部失败&…

APP安全测试总结-看这篇就够了

APP安全测试项总结如下&#xff1a; 一、静态分析 代码审查&#xff1a;检查代码是否存在安全漏洞&#xff0c;如硬编码密码、敏感信息明文存储等。配置文件分析&#xff1a;分析APP的配置文件&#xff0c;查看是否存在不当的权限设置等。反编译测试&#xff1a;使用反编译工…

【我是产品经理_注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

go匿名函数

【1】Go支持匿名函数&#xff0c;如果我们某个函数只是希望使用一次&#xff0c;可以考虑使用匿名函数 【2】匿名函数使用方式&#xff1a; &#xff08;1&#xff09;在定义匿名函数时就直接调用&#xff0c;这种方式匿名函数只能调用一次&#xff08;用的多&#xff09; &am…

【推荐系统简介以及其链路流程】

文章目录 1、数据收集和预处理1.1、推荐系统的数据架构 2、用户&#xff08;user&#xff09;画像和物品&#xff08;item&#xff09;画像的构建3、特征工程3.1、特征提取的框架3.1.1、物料画像3.1.2、用户画像3.1.3、交叉特征3.1.4、偏差特征 3.2、数值特征的处理3.2.1、缺失…

数据更新-插入元组(VALUES)、修改属性(SET)、删除元组(DELETE)

一、插入元组 1、插入单个元组&#xff08;使用的是VALUES子句&#xff09; &#xff08;1&#xff09;语句格式 INSERT INTO <表名> 【&#xff08;<属性名1【&#xff0c;<属性名2>&#xff0c;...】&#xff09;】 VALUES &#xff08;<常量1>【&a…