摘要:功能演進基礎服務器支持中間件支持異步中間件切換為裝飾增強細化統(tǒng)一異常處理細化流程控制自定義注解攔截管理注入組件標記自動處理返回值事務緩存框架權限認證策略模式裝飾模式
功能演進: V1:
基礎http服務器
支持中間件
支持異步中間件
V1.x:JS切換為TS
request/response裝飾增強
細化統(tǒng)一異常處理
細化流程控制
V2:AOP自定義注解攔截
IOC管理注入@Controller/@Service組件
@Request標記handler
@ResponseBody自動處理返回值
事務
V2.x:緩存框架
權限認證(AOP,策略模式,裝飾模式)
V1: SOS.jsconst http = require("http"); const url = require("url"); const EventEmitter = require("events"); const compose = (ctx) => (...funcs) => { if (funcs.length === 0) { return arg => arg } let lastIndex = funcs.length - 1; return funcs.reduceRight((a, b, index) => b(() => { if (index === funcs.length - 1) { return Promise.resolve(); } if (lastIndex !== index) { return Promise.reject(new Error("can not call next() over once!")) } lastIndex--; try { return Promise.resolve(a(ctx)); } catch (e) { return Promise.reject(e); } }), 1); }; const applyMiddleware = (middles, ctx) => compose(ctx)(...middles); class SOS extends EventEmitter { constructor() { this.middleWares = []; this.serve = http.createServer(async (req, res) => { const ctx = { req, res }; const handler = applyMiddleware(this.middleWares, ctx); await handler(ctx); res.finisn || res.end(); }); } use(mid) { this.middleWares.push(mid); } listen(...agr) { this.serve.listen(...agr); console.log("starting"); } onerror(err, ctx) { if (err.code === "ENOENT") { ctx.status = 404; } else { ctx.status = 500; } let msg = err.message || "000 error"; ctx.res.end(msg); this.emit("error", err); } }test.js
const sos = new SOS(); sos.listen(9009); sos.use((next) =>async (ctx) => { console.log(" pathname::",url.parse(ctx.req.url).pathname); ctx.res.write(new Date()+""); console.log("before 111"); ctx.res.write("before 111 "); await next(); console.log("after 111"); ctx.res.write("after 111 "); }); sos.use((next) =>async (ctx) => { console.log("before 222"); ctx.res.write("before 222 "); await next(); console.log("after 222"); ctx.res.write("end test222 "); return new Promise((resolve, reject) => { setTimeout(() => { console.log("timeout 222 "); ctx.res.write("timeout 222 "); return resolve(); }, 3000); }); }); sos.use((next) =>async (ctx) => { console.log("before 333"); ctx.res.write("before 333 "); await next(); console.log("after 333"); ctx.res.write("end test333 "); });
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://hztianpu.com/yun/110006.html
摘要:一個標準性的事件就是年的橫空出世。引擎快速處理能力和異步編程風格,讓開發(fā)者從多線程中解脫了出來。其次,通過異步編程范式將其高并發(fā)的能力發(fā)揮的淋漓盡致。它也僅僅是一個處理請求并作出響應的函數(shù),并無任何特殊之處。 showImg(https://segmentfault.com/img/remote/1460000010819116); 在正式學習 Express 內(nèi)容之前,我們有必要從大...
摘要:本文轉載自眾成翻譯譯者網(wǎng)絡埋伏紀事鏈接原文本章我會指導你啟動一個簡單的服務器,并開始為請求服務。現(xiàn)在,我們開始創(chuàng)建第一個服務器我們將模塊,并將服務器綁定到端口來監(jiān)聽。必須用如下方式啟動服務器總結本章學習了如何從頭開始創(chuàng)建第一個服務器。 本文轉載自:眾成翻譯譯者:網(wǎng)絡埋伏紀事鏈接:http://www.zcfy.cc/article/1750原文:https://blog.risings...
摘要:感謝大神的免費的計算機編程類中文書籍收錄并推薦地址,以后在倉庫里更新地址,聲音版全文狼叔如何正確的學習簡介現(xiàn)在,越來越多的科技公司和開發(fā)者開始使用開發(fā)各種應用。 說明 2017-12-14 我發(fā)了一篇文章《沒用過Node.js,就別瞎逼逼》是因為有人在知乎上黑Node.js。那篇文章的反響還是相當不錯的,甚至連著名的hax賀老都很認同,下班時讀那篇文章,竟然坐車的還坐過站了。大家可以很...
摘要:感謝大神的免費的計算機編程類中文書籍收錄并推薦地址,以后在倉庫里更新地址,聲音版全文狼叔如何正確的學習簡介現(xiàn)在,越來越多的科技公司和開發(fā)者開始使用開發(fā)各種應用。 說明 2017-12-14 我發(fā)了一篇文章《沒用過Node.js,就別瞎逼逼》是因為有人在知乎上黑Node.js。那篇文章的反響還是相當不錯的,甚至連著名的hax賀老都很認同,下班時讀那篇文章,竟然坐車的還坐過站了。大家可以很...
閱讀 2769·2023-04-25 15:07
閱讀 863·2021-11-24 10:21
閱讀 2488·2021-09-22 10:02
閱讀 3626·2019-08-30 15:43
閱讀 3348·2019-08-30 13:03
閱讀 2431·2019-08-29 17:18
閱讀 3701·2019-08-29 17:07
閱讀 2035·2019-08-29 12:27