摘要:功能演進基礎(chǔ)服務(wù)器支持中間件支持異步中間件切換為裝飾增強細化統(tǒng)一異常處理細化流程控制自定義注解攔截管理注入組件標記自動處理返回值事務(wù)緩存框架權(quán)限認證策略模式裝飾模式
功能演進: V1:
基礎(chǔ)http服務(wù)器
支持中間件
支持異步中間件
V1.x:JS切換為TS
request/response裝飾增強
細化統(tǒng)一異常處理
細化流程控制
V2:AOP自定義注解攔截
IOC管理注入@Controller/@Service組件
@Request標記handler
@ResponseBody自動處理返回值
事務(wù)
V2.x:緩存框架
權(quán)限認證(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 "); });
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/110006.html
摘要:一個標準性的事件就是年的橫空出世。引擎快速處理能力和異步編程風(fēng)格,讓開發(fā)者從多線程中解脫了出來。其次,通過異步編程范式將其高并發(fā)的能力發(fā)揮的淋漓盡致。它也僅僅是一個處理請求并作出響應(yīng)的函數(shù),并無任何特殊之處。 showImg(https://segmentfault.com/img/remote/1460000010819116); 在正式學(xué)習(xí) Express 內(nèi)容之前,我們有必要從大...
摘要:本文轉(zhuǎn)載自眾成翻譯譯者網(wǎng)絡(luò)埋伏紀事鏈接原文本章我會指導(dǎo)你啟動一個簡單的服務(wù)器,并開始為請求服務(wù)?,F(xiàn)在,我們開始創(chuàng)建第一個服務(wù)器我們將模塊,并將服務(wù)器綁定到端口來監(jiān)聽。必須用如下方式啟動服務(wù)器總結(jié)本章學(xué)習(xí)了如何從頭開始創(chuàng)建第一個服務(wù)器。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀事鏈接:http://www.zcfy.cc/article/1750原文:https://blog.risings...
摘要:感謝大神的免費的計算機編程類中文書籍收錄并推薦地址,以后在倉庫里更新地址,聲音版全文狼叔如何正確的學(xué)習(xí)簡介現(xiàn)在,越來越多的科技公司和開發(fā)者開始使用開發(fā)各種應(yīng)用。 說明 2017-12-14 我發(fā)了一篇文章《沒用過Node.js,就別瞎逼逼》是因為有人在知乎上黑Node.js。那篇文章的反響還是相當不錯的,甚至連著名的hax賀老都很認同,下班時讀那篇文章,竟然坐車的還坐過站了。大家可以很...
摘要:感謝大神的免費的計算機編程類中文書籍收錄并推薦地址,以后在倉庫里更新地址,聲音版全文狼叔如何正確的學(xué)習(xí)簡介現(xiàn)在,越來越多的科技公司和開發(fā)者開始使用開發(fā)各種應(yīng)用。 說明 2017-12-14 我發(fā)了一篇文章《沒用過Node.js,就別瞎逼逼》是因為有人在知乎上黑Node.js。那篇文章的反響還是相當不錯的,甚至連著名的hax賀老都很認同,下班時讀那篇文章,竟然坐車的還坐過站了。大家可以很...
閱讀 2609·2023-04-25 15:07
閱讀 714·2021-11-24 10:21
閱讀 2318·2021-09-22 10:02
閱讀 3525·2019-08-30 15:43
閱讀 3239·2019-08-30 13:03
閱讀 2300·2019-08-29 17:18
閱讀 3596·2019-08-29 17:07
閱讀 1884·2019-08-29 12:27