逻辑: 首先把routerUrl目录下的函数初始化缓存起来,通过Router.request调用缓存起来的函数,这个函数实际上是register.set方法,主要是开始运行函数链,通过register.next 运行下一个函数。
函数流 main.js –> Router.request –> register.set –> register.next –> sock.write
main.js
'use strict';
const routerUrl = 'router'; // 当前目录下的router地址
const Router = require('./net/Router'); // 初始化路由
const net = require('net');
const port = '3000';
Router.init(routerUrl);
const app = sock => {
sock.on('data', function (data) {
try {
Router.request(data, sock);
} catch (error) {
console.log(error)
}
}); sock.on('error', (err) => {
console.log(err)
})
// 为这个socket实例添加一个"close"事件处理函数
sock.on('close', function (data) {
console.log('clone')
})
}
const server = net.createServer(app);
server.listen(port, () => {
console.log(`Startu in env ${process.env.NODE_ENV || 'development'} on port ${port}`);
});
server.on('error', (err) => {
console.log(err)
})
路由加载:
Router.js文件
const fs = require('fs');
const _ = require('lodash');
var path = require("path");
var ROOT_PATH = path.resolve(__dirname);
class Router {
constructor() {
this.routeMap = {};
}
/**
* 通过routerUrl来匹配目录下的文件,加载进来
* @param {*} routerUrl
*/
init(routerUrl) {
let files = fs.readdirSync(path.join(ROOT_PATH, `../${routerUrl}`));
return _.reduce(files, (config, file) => {
let svc = require(path.join(ROOT_PATH, `../${routerUrl}/${file}`));
this.routeMap = {
[file.split('.')[0]]: svc.get()
};
}, {})
}
/**
* 通过url匹配加载的router, 其他字段可自定义,url这里的逻辑也可改成配置文件进行配置,类似于protobuf
* @param {*} data {url, body}
* @param {*} sock
*/
request(data, sock) {
try {
this.routeMap[result.url.split('/')[1]][result.url.replace(`/${result.url.split('/')[1]}`, '')](data, sock);
} catch (error) {
sock.write(error);
}
}
}module.exports = new Router();
中间件:
register.js文件
const Next = require('./next');class Register {
constructor() {
this._init = {};
}
<!-- 初始化router函数,开始运行函数链 -->
set(url, ...handlers) {
this._init[url] = async (data, sock) => {
try {
let next = new Next(handlers);









