js作用在服务器,在?用Node.js实现一个http服务器框架?

功能演进:

V1:

基础http服务器

支持中间件

支持异步中间件

V1.x:

JS切换为TS

request/response装饰增强

细化统一异常处理

细化流程控制

V2:

AOP自定义注解拦截

IOC管理注入@Controller/@Service组件

@Request标记handler

@ResponseBody自动处理返回值

事务

V2.x:

缓存框架

权限认证(AOP,策略模式,装饰模式)

V1:

SOS.js

const 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('\npathname::',url.parse(ctx.req.url).pathname);

ctx.res.write(new Date()+'');

console.log('before 111');

ctx.res.write('before 111\n');

await next();

console.log('after 111');

ctx.res.write('after 111\n');

});

sos.use((next) =>async (ctx) => {

console.log('before 222');

ctx.res.write('before 222\n');

await next();

console.log('after 222');

ctx.res.write('end test222\n');

return new Promise((resolve, reject) => {

setTimeout(() => {

console.log('timeout 222 ');

ctx.res.write('timeout 222 \n');

return resolve();

}, 3000);

});

});

sos.use((next) =>async (ctx) => {

console.log('before 333');

ctx.res.write('before 333\n');

await next();

console.log('after 333');

ctx.res.write('end test333\n');

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值