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