最新要闻
- 我要我们在一起 邓紫棋mp3 百度网盘_我要我们在一起 邓紫棋
- 蔚来:好人就该被人拿枪指着?
- 4L油箱多跑80km、售价2000元 宝骏悦也增程器实体亮相
- 可怕!男子肠道长满200多个息肉:做了3个小时手术摘除
- 高质量发展调研行丨山东烟台:“老树新枝”打造发展新动能
- 泽璟制药:注射用ZG006获得药物临床试验批准通知书
- 韩国室温超导论文真假成谜 专家:极有可能只是假象
- vivo首颗自研6nm芯片!V3影像芯片正式公布
- 这东西也敢偷?卖不掉,就扔进垃圾场……栽了!
- 《封神》票房跻身第四!国内7月总票房突破80亿元
- 华为暴涨58%!2023Q2中国手机市场销量数据出炉
- 被中消协点名后 妙鸭相机上架苹果应用商店:山寨App横行真假难分
- 骁龙870太坚挺!联想小新Pad Pro 12.7上架:2.9K高刷屏
- 曼联新赛季阵容基本完成升级,你认为这个阵容应该拿到什么成绩?
- 豆瓣7.7分 《封神第一部》票房破10亿:张颂文大赞世界级视听效果
- 一口下去嘎嘣脆!亲亲经典虾条大促:5件立减15元 17.9到手
广告
手机

英国房地产因利率上升陷入困境 房价正以2011年来最快速度下跌

宁夏评选出上半年10名“宁夏好人” 95后消防员因敬业奉献入选
- 英国房地产因利率上升陷入困境 房价正以2011年来最快速度下跌
- 宁夏评选出上半年10名“宁夏好人” 95后消防员因敬业奉献入选
- 离婚时共同债务应该怎么处理?
- 华为云盘古大模型3.0正式发布
- 支持自动长文生成,WPS AI发布:基于大语言模型的智能办公助手
- 《街头霸王6》全球总销量突破200万份 卡普空再次为其玩家送上礼物
家电
从0开发属于自己的nestjs框架的mini 版 —— 终极篇
(资料图片)
这篇其实是最简单的,就是将前面所实现的ioc,路由整合在一起就可以了
话不多说,直接上代码
\src\koa-ioc.ts
引入相关库
import Koa from "koa";import koaRouter from "koa-router";import { ContainerModule } from "./ioc-module";import { Type } from "./ioc-core.ts";import { ResigerRouter } from "./koa-decorator";
声明类型
/****************声明类型************ *//** * 异常响应类型 */export type IExceptionsFilter = ( ctx: Koa.DefaultContext, error: Error) => void | any | Promise;/** * 成功响应类型 */export type IResponseInterceptor = (ctx: Koa.DefaultContext) => unknown;/** * 实例参数类型 */interface IKoaNestOption { koaOption?: ConstructorParameters; // ConstructorParameters获取构造函数参数的类型 prefix?: string; routerOptions?: koaRouter.IRouterOptions; [key: string]: any;}
NestFactory 实现的
export class NestFactory { [x: string]: any; private iocInstance: ContainerModule; // ioc容器实例 private koaInstance: Koa; // koa 实例 private routerInstance: koaRouter; // 路由实例 private middleWareQuence: Array = []; // 全局中间件 private exceptionsFilterQuence: Array = []; // 全局异常拦截器(中间件) private responseInterceptorQuence: Array = []; // 全局响应拦截器(中间件) constructor(appModule: Type, options: IKoaNestOption = {}) { const { routerOptions = {}, koaOption = {} } = options || {}; this.iocInstance = new ContainerModule(appModule); this.routerInstance = new koaRouter({ ...routerOptions, prefix: options.prefix, }); this.koaInstance = new Koa(koaOption); } private init() { this.appError(); // 加载全局中间件 this.koaInstance.use(this.setFirstMiddleware()); this.middleWareQuence.forEach((middleware: Koa.Middleware) => this.koaInstance.use(middleware) ); // 加载路由 this.loadRoutes(); } // 设置第一个中间,可以捕获(任何一个中间件异常)全局响应和错误处理 private setFirstMiddleware = () => { return async (ctx: Koa.DefaultContext, next: Function) => { try { ctx.requestId = Math.random(); await next(); this.responseInterceptorQuence.forEach((itme) => itme(ctx)); } catch (error) { ctx.app.emit("error", error, ctx); } }; }; /** * 加载路由 */ private loadRoutes() { const ctrInstance = this.iocInstance.getControllerInstance(); ctrInstance.forEach((itme) => ResigerRouter(this.routerInstance, itme)); this.koaInstance.use(this.routerInstance.routes()); } // 监听错误响应 private appError() { this.koaInstance.on("error", (error: Error, ctx: Koa.DefaultContext) => { this.exceptionsFilterQuence.forEach((itme) => itme(ctx, error)); }); } //添加全局中间件 public use(...middleware: Array) { this.middleWareQuence = [...this.middleWareQuence, ...middleware]; } //添加全局异常拦截器 public setGlobalExceptionsFilter(...fn: Array) { this.exceptionsFilterQuence = [...this.exceptionsFilterQuence, ...fn]; } // 添加全局响应拦截器 public setGlobalResponseInterceptor(...fn: Array) { this.responseInterceptorQuence = [...this.responseInterceptorQuence, ...fn]; } //服务启动 public listen(port: number, host?: string | Function, callback?: Function) { this.init(); if (typeof host == "function") { callback = host; host = "0.0.0.0"; } this.koaInstance.listen(port, host, callback && callback()); } public getKoa() { return this.koaInstance; } public getRouter() { return this.routerInstance; }}
测试用例
import Koa from "koa";import { Controller, GET, Query, Ctx } from "./koa-decorator";import { NestFactory } from "./koa-ioc";import { Module } from "./ioc-module";import { Injectable, Inject } from "./ioc-core";@Injectable()class UserService { private data: Array = []; constructor() { this.data = [{ id: 1 }, { id: 2 }, { id: 3 }]; } findUser(id: number) { return this.data.find((item) => item.id == id); }}@Controller("user")class UserController { constructor(private userService: UserService) {} @GET("list") getUserId(@Query("id") id: number, @Ctx() ctx: Koa.DefaultContext) { console.log("ctx", ctx, id); let result = this.userService.findUser(id); if (!result) { throw new Error(`用户id [${id}] 不存在`); } return result; }}@Module({ providers: [UserService], controllers: [UserController], imports: [],})class AppModule {}function start() { const app = new NestFactory(AppModule, { prefix: "/api" }); // 全局响应中间件 app.setGlobalResponseInterceptor(async (ctx) => { ctx.body = await { data: ctx.body, success: true, status: 200 }; }); // 全局异常捕获中间件 app.setGlobalExceptionsFilter(async (ctx, error) => { ctx.body = await { data: null, success: false, status: 500, message: error.message ? error.message : error, }; }); app.listen(8000, () => { console.info("app is runing in prot 8080"); });}start();
总结
1、至此,一个mini 版本的nestjs 框架就完成了2、重提一点,这个只是学习,对于使用nestjs 也是有很大帮助的3、在此基础是可以扩展更多的功能,比如类中间件,方法中间件,守卫,管道等等也是可以的4、这个是基础版本,想要更完善的功能学习的,可以参考 npm i @bylive/nestjs 这个增强版的
关键词:
-
-
-
-
从0开发属于自己的nestjs框架的mini 版 —— 终极篇
我要我们在一起 邓紫棋mp3 百度网盘_我要我们在一起 邓紫棋
【财经分析】大豆完全成本保险提振豆农积极性和种植信心
蔚来:好人就该被人拿枪指着?
4L油箱多跑80km、售价2000元 宝骏悦也增程器实体亮相
可怕!男子肠道长满200多个息肉:做了3个小时手术摘除
从0开发属于自己的nestjs框架的mini 版 —— Module篇
高质量发展调研行丨山东烟台:“老树新枝”打造发展新动能
Golang漏洞管理
泽璟制药:注射用ZG006获得药物临床试验批准通知书
韩国室温超导论文真假成谜 专家:极有可能只是假象
vivo首颗自研6nm芯片!V3影像芯片正式公布
这东西也敢偷?卖不掉,就扔进垃圾场……栽了!
深圳市住房和建设局:更好满足居民刚性和改善性住房需求 促进房地产市场平稳健康发展
《封神》票房跻身第四!国内7月总票房突破80亿元
华为暴涨58%!2023Q2中国手机市场销量数据出炉
被中消协点名后 妙鸭相机上架苹果应用商店:山寨App横行真假难分
骁龙870太坚挺!联想小新Pad Pro 12.7上架:2.9K高刷屏
曼联新赛季阵容基本完成升级,你认为这个阵容应该拿到什么成绩?
豆瓣7.7分 《封神第一部》票房破10亿:张颂文大赞世界级视听效果
一口下去嘎嘣脆!亲亲经典虾条大促:5件立减15元 17.9到手
“原来微信可以防拉黑”引热议 网友:就喜欢看不惯 又拉黑不了的样子
mysql 简单进阶 ———— 多列索引[一]
事关食品安全,江西明年元旦实施
杜苏芮减弱 卡努正在增强:台风吹来的遍地生蚝 到底能不能吃?
不愧是新能源行业的“基建狂魔” 蔚来1600座换电站达成
20万圆“宝马3系”梦!宝马i3被曝19.6万元特价卖
李玟遗产纷争升级,Bruce发声明低调回应,李思林不予回复
罗布泊无人区究竟有多危险?中国四大无人区之一、充满神秘的“地球之耳”
电竞首次入亚!杭州亚运会电竞项目赛程出炉:玩游戏也能拿金牌了
代码随想录算法训练营第三天|力扣203.移除链表元素、力扣707.设计链表、力扣206.反转链表
【设计原则】图解何为依赖倒置
今年暑期档总票房突破120亿
儿子考上北大 奶茶店主送2000杯奶茶 学生:沾沾喜气
少女连续数日高烧不退确诊“接吻病” 医生科普:病毒感染引起
JFrame一些基础小知识
占用应急车道 深圳一宝马男连着两天被后车拍照举报:12分罚款6000
2176万人观看 《封神第一部》票房逼近10亿 知名编剧:第二部比第一部好看至少十倍
大众被曝将使用小鹏旧平台 明年开始向小鹏支付“技术费”
姚振华,又输了!
J.D.Power发布汽车保值率排行榜:日系车屠榜 飞度保值堪比保时捷
自主知识产权!“新舟”60灭火机平台首飞成功:运输、灭火全能王
北京瑞蚨祥(关于北京瑞蚨祥的介绍)
国人自己的操作系统!华为鸿蒙OS 4.0下周发布:官方海报大有玄机
史上最贵!iPhone 15系列全系售价曝光 网友:多花钱也得买高配版
华为nova 10 Pro官方翻新机视频开箱:成色接近新机 只要2499元起
全国文化和旅游资源开发工作会议在并召开
docker查看日志:docker service logs 与 docker container logs
硬件管理平台 - 引言(一)
男子开车时跟老婆吵架车瞬间报废 承担事故全部责任:网友感叹
票房近10亿!《封神》进2023年票房榜前十:投资30亿 导演称若失败10年还债
12999元 感谢老黄?英伟达喊你买卡了:公版RTX 4090卷土重来
北大青鸟手提式环保家用小型车载灭火器到手9元:安全可靠
属于数据的属性的是及时性、链接性_以下哪种情况属于属性错放
瘫痪男子大脑植入芯片:触觉恢复
警惕“杜苏芮”台风:这些用电常识不可忽视
TCL中环公示单晶硅片价格 上调3.5%-5.2%不等
Go语言中init函数执行的顺序
专家:肥胖人群的肥胖程度越来越高
韩国室温超导是突破还是乌龙?专家解读
win11下docker安装常用中间件-Redis
太平天国进入南京以后,确实犯了很多错误,但是也没必要妖魔化太平天国吧?
电影《热烈》首映日当晚票房破2亿!导演大鹏说把片酬给邓超了
太炫了!索泰ChinaJoy 2023展出多款限量显卡
跨越万里的双向奔赴!父母不懂英语 从县城出国看女儿
车辙是什么意思(车辙解释)
[算法笔记] DFS搜索
从此告别涂硅脂 利民推出新款CPU固态导热硅脂片:一片26.9元
POL连续四年第一!华为已发布新一代Wi-Fi 7万兆园区光网
牧原股份董秘回复:公司目前10万头全线场的人员标准配置为100人左右
民间《中国历代文豪图鉴》出炉:文笔李白唯一100分 白居易6边型战士
台风天在玻璃上贴胶带有用吗?300万粉大V科普:徒劳无益 画蛇添足
2023第二季度快递满意度出炉:第一不出意料
马斯克能忍?国内惊显特斯拉Semi电动卡车仿制品 网友:贴脸输出
虐心(关于虐心简述)
蜜雪冰城阴阳怪气瑞幸?实为网友玩梗:讽刺瑞幸多冰
一儿童高速驾车 副驾驶家长直言:龙王儿子必须得会浮水
10999元!拯救者R9000X 2023发布:AMD中国特供锐龙7 7840H
鼠标垫怎么清洗才能干净 鼠标垫怎么清洗
接口自动化测试框架实战训练营第一天
中华老字号:西安饭庄油泼biangbiang面4.9元/盒史低(不到半价)
车船税没白交 一电动出租车涉水漂过:燃油车主集体看呆
索尼音乐喜迎新人:甄子丹女儿官宣出道 仅19岁
回顾:当吴谢宇举起屠刀时,可否想到母亲养育自己的辛苦?人性之复杂难测,善与恶的较量,永无止境
1000元白菜价电视能买吗?这些信息必须掌握
16家网约车平台被约谈:落实降低过高抽成比例要求
凤凰传奇,幸亏没结婚
【技术实战】Vue技术实战【五】
机器人技术打破国外垄断 巨轮智能总经理意外去世:年仅45岁
这种无理数中的无理数 让数学家直呼根本停不下来
8月8日上市 荣耀MagicBook X Pro锐龙版2023亮相:首发MagicOS 7.2
印尼耍蛇人表演时试图亲吻蛇被咬死 眼镜王蛇有多毒:一滴致命
每周4班 哈尔滨至俄罗斯符拉迪沃斯托克航线复航
2230小尺寸 七彩虹新款PCIe 4.0 SSD上架:1TB售499元
2023暑期档票房破120亿:冠军35亿、《封神第一部》冲到第四
各路厂商争抢年轻用户!ChinaJoy 2023开展:ShowGirl小姐姐依然亮眼
VSCode中的快捷键
《中国碳捕集利用与封存年度报告(2023)》发布
不是抖音的错 东方甄选回应直播间被关:自己不小心出问题 积极整改
OPPO Reno10 Pro英雄联盟定制礼盒发布:3899元 标配16GB内存