最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解一個基于套接字實現(xiàn)長連接的express

 更新時間:2019年03月28日 14:16:46   作者:fuqihan  
這篇文章主要介紹了詳解一個基于套接字實現(xiàn)長連接的express,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

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

函數(shù)流 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"事件處理函數(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 = {};
  }
  /**
   * 通過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函數(shù),開始運行函數(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;
  }
  <!-- 運行中間件 -->
  run(data, sock) {
    this.data = data;
    this.sock = sock;
    this.stack[this.index](data, sock, this.next.bind(this));
  }
  <!-- 調(diào)到下一個中間件,若帶參數(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;

注冊文件

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é):這個項目只是用來歇息express的思想,要用在實際開發(fā)中還需要斷線重連,優(yōu)化連接,異常處理等功能。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Node.js數(shù)據(jù)庫操作之查詢MySQL數(shù)據(jù)庫(二)

    Node.js數(shù)據(jù)庫操作之查詢MySQL數(shù)據(jù)庫(二)

    這篇文章主要介紹了Node.js數(shù)據(jù)庫操作之查詢MySQL數(shù)據(jù)庫的相關(guān)資料,文中介紹的非常詳細,對大家學習或者使用mysql能帶來一定的幫助,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • Nodejs進階:如何將圖片轉(zhuǎn)成datauri嵌入到網(wǎng)頁中去實例

    Nodejs進階:如何將圖片轉(zhuǎn)成datauri嵌入到網(wǎng)頁中去實例

    這篇文章主要介紹了Nodejs進階:如何將圖片轉(zhuǎn)成datauri嵌入到網(wǎng)頁中去,有興趣的可以了解一下。
    2016-11-11
  • express中間件加載機制示例詳解

    express中間件加載機制示例詳解

    中間件是一種方法,可以接收客戶端發(fā)來的請求,可以對請求做出響應,也可以將請求繼續(xù)交給下一個中間件繼續(xù)處理,下面這篇文章主要給大家介紹了關(guān)于express中間件加載機制的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 監(jiān)控Nodejs的性能實例代碼

    監(jiān)控Nodejs的性能實例代碼

    這篇文章主要介紹了監(jiān)控Nodejs的性能實例代碼,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • Electron如何通過ffi-napi調(diào)用dll導出接口

    Electron如何通過ffi-napi調(diào)用dll導出接口

    文章介紹了如何在Electron項目中使用ffi-napi模塊調(diào)用DLL文件,并詳細描述了環(huán)境搭建、安裝Electron和ffi-napi、配置Visual Studio和Python環(huán)境、解決常見問題等步驟,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • node.js express捕獲全局異常的三種方法實例分析

    node.js express捕獲全局異常的三種方法實例分析

    這篇文章主要介紹了node.js express捕獲全局異常的三種方法,結(jié)合實例形式簡單分析了node.js express捕獲全局異常的常見操作方法與使用注意事項,需要的朋友可以參考下
    2019-12-12
  • NodeJS配置HTTPS服務實例分享

    NodeJS配置HTTPS服務實例分享

    本文給大家分享的是在nodejs中配置https服務的方法和具體的示例,非常的詳細,有需要的小伙伴可以來參考下
    2017-02-02
  • 詳解Node.js如何處理ES6模塊

    詳解Node.js如何處理ES6模塊

    學習JavaScript語言,你會發(fā)現(xiàn)它有兩種格式的模塊。一種是ES6模塊,簡稱ESM;另一種是Node.js專用的CommonJS模塊,簡稱 CJS。這兩種模塊不兼容。很多人使用Node.js,只會用require()加載模塊,遇到ES6模塊就不知道該怎么辦。本文就來談談ES6模塊在Node.js里面怎么使用。
    2021-05-05
  • nodejs中使用worker_threads來創(chuàng)建新的線程的方法

    nodejs中使用worker_threads來創(chuàng)建新的線程的方法

    這篇文章主要介紹了nodejs中使用worker_threads來創(chuàng)建新的線程的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • node 安裝 windows-build-tools全過程

    node 安裝 windows-build-tools全過程

    這篇文章主要介紹了node 安裝 windows-build-tools全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論

区。| 二手房| 南昌县| 安国市| 汝南县| 高陵县| 七台河市| 郯城县| 郸城县| 隆子县| 四会市| 边坝县| 醴陵市| 卢湾区| 深圳市| 于都县| 固安县| 高邑县| 定襄县| 乐东| 嘉定区| 增城市| 循化| 白水县| 江安县| 河北区| 大余县| 思茅市| 内丘县| 比如县| 慈利县| 巴楚县| 邳州市| 东城区| 苏州市| 屯昌县| 巴彦县| 吴川市| 聂荣县| 博客| 平潭县|