国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

詳解一個(gè)基于套接字實(shí)現(xiàn)長(zhǎng)連接的express

2019-11-19 11:55:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

邏輯: 首先把routerUrl目錄下的函數(shù)初始化緩存起來(lái),通過(guò)Router.request調(diào)用緩存起來(lái)的函數(shù),這個(gè)函數(shù)實(shí)際上是register.set方法,主要是開始運(yùn)行函數(shù)鏈,通過(guò)register.next 運(yùn)行下一個(gè)函數(shù)。

函數(shù)流 main.js --> Router.request --> register.set --> register.next --> sock.write

main.js

'use strict';const routerUrl = 'router'; // 當(dāng)前目錄下的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)  })  // 為這個(gè)socket實(shí)例添加一個(gè)"close"事件處理函數(shù)  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 = {};  }  /**   * 通過(guò)routerUrl來(lái)匹配目錄下的文件,加載進(jìn)來(lái)   * @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()      };    }, {})  }  /**   * 通過(guò)url匹配加載的router, 其他字段可自定義,url這里的邏輯也可改成配置文件進(jìn)行配置,類似于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函數(shù),開始運(yùn)行函數(shù)鏈 -->  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函數(shù) -->  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;  }  <!-- 運(yùn)行中間件 -->  run(data, sock) {    this.data = data;    this.sock = sock;    this.stack[this.index](data, sock, this.next.bind(this));  }  <!-- 調(diào)到下一個(gè)中間件,若帶參數(shù)就跳到第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;

注冊(cè)文件

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

總結(jié):這個(gè)項(xiàng)目只是用來(lái)歇息express的思想,要用在實(shí)際開發(fā)中還需要斷線重連,優(yōu)化連接,異常處理等功能。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇赉县| 浦县| 康马县| 磴口县| 福贡县| 太原市| 阿拉善盟| 乌兰察布市| 禹城市| 阿拉善右旗| 进贤县| 驻马店市| 秦皇岛市| 高青县| 申扎县| 勃利县| 靖边县| 郎溪县| 萨迦县| 错那县| 博客| 石景山区| 磴口县| 台湾省| 新巴尔虎右旗| 都昌县| 河东区| 平江县| 平乐县| 乃东县| 海林市| 时尚| 马关县| 广德县| 夏邑县| 安溪县| 大洼县| 襄汾县| 河北省| 广州市| 胶南市|