소켓 기반 의 긴 연결 을 위 한 express

논리:우선 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);
        next.run(data, sock);  
      } catch (error) {
        sock.write(error);
      }
    };
  }
  <!--       router   -->
  get() {
    return this._init;
  }
}

module.exports = new Register();

nest.js 파일

class Next {
  constructor(stack) {
    this.index = 0;
    this.stack = stack;
    this.data = null;
    this.sock = null;
  }
  <!--       -->
  run(data, sock) {
    this.data = data;
    this.sock = sock;
    this.stack[this.index](data, sock, this.next.bind(this));
  }
  <!--         ,        arguments[0]  -->
  next() {
    if (arguments[0] && arguments[0] === +arguments[0] && +arguments[0] < this.stack.length) {
      this.index = +arguments[0];
      return this.run(data, this.sock);
    }
    this.index++;
    this.run(this.data, this.sock);
  }
}

module.exports = Next;

등록 서류

const init = require('../net/register');

init.set('/test',
  (data, sock, next) => {
    next()
  },
  async (data, sock) => {
    try {
      sock.write(test);
    } catch (e) {
      sock.write(e);
    }
  });

요약:이 프로젝트 는 express 의 사상 을 휴식 시 키 는 데 사 용 될 뿐 실제 개발 에 사용 하려 면 단선 재 연결,최적화 연결,이상 처리 등 기능 이 필요 하 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기