欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

邏輯: 首先把routerUrl目錄下的函數(shù)初始化緩存起來,通過Router.request調用緩存起來的函數(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));
  }
  <!-- 調到下一個中間件,若帶參數(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);
    }
  });

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

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

相關文章

  • node+koa+canvas繪制出貨單、收據(jù)票據(jù)的方法

    node+koa+canvas繪制出貨單、收據(jù)票據(jù)的方法

    在生成票據(jù)需求中,我們會想到前端生成或者后端生成返回圖片地址訪問兩個方法,前端生成則不需要調用接口,而后端是在完成整個流程時就進行生成然后把上傳的地址保存數(shù)據(jù)庫,這篇文章主要介紹了node+koa+canvas繪制出貨單,收據(jù),票據(jù),需要的朋友可以參考下
    2022-09-09
  • npm?install?-g?@vue/cli常見問題解決匯總

    npm?install?-g?@vue/cli常見問題解決匯總

    這篇文章主要給大家介紹了關于npm?install?-g?@vue/cli常見問題解決的相關資料,文中通過實例代碼將解決的方式介紹的非常詳細,對遇到這個問題的朋友具有一定的參考學習價值,需要的朋友可以參考下
    2022-08-08
  • nodejs實現(xiàn)郵件發(fā)送服務實例分享

    nodejs實現(xiàn)郵件發(fā)送服務實例分享

    本文給大家講解的是簡單的使用nodejs搭建郵件發(fā)送服務的一個實例,非常的好用,有需要的小伙伴可以參考下
    2017-03-03
  • 使用命令行升級Node.js的版本的操作指南

    使用命令行升級Node.js的版本的操作指南

    這篇文章主要給大家介紹了關于如何使用命令行升級Node.js的版本的操作指南,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2023-11-11
  • node.js調用Chrome瀏覽器打開鏈接地址的方法

    node.js調用Chrome瀏覽器打開鏈接地址的方法

    其實在Node.JS中打開瀏覽器網(wǎng)址非常簡單,但還是有必要整理下分享給有需要的朋友們,這篇文章主要給大家介紹了node.js如何調用Chrome瀏覽器打開鏈接地址的方法,文中介紹的非常詳細,需要的朋友們下面隨著小編來一起看看吧。
    2017-05-05
  • 使用nodejs開發(fā)cli項目實例

    使用nodejs開發(fā)cli項目實例

    這篇文章主要介紹了使用nodejs開發(fā)cli項目實例,本文講解使用generator-cli-starter實現(xiàn)cli項目的開發(fā),需要的朋友可以參考下
    2015-06-06
  • PHPStorm中如何對nodejs項目進行單元測試詳解

    PHPStorm中如何對nodejs項目進行單元測試詳解

    這篇文章主要給大家介紹了關于PHPStorm中如何對nodejs項目進行單元測試的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • node.js中watch機制詳解

    node.js中watch機制詳解

    本文給大家?guī)淼氖且黄P于nodejs中watch機制的探討,主要探討內容是為什么watch不是銀彈,嘗試使用更好的方案來解決這個問題
    2014-11-11
  • Node.js中process模塊常用的屬性和方法

    Node.js中process模塊常用的屬性和方法

    Node.js中的process模塊用來與當前進程互動,可以通過全局變量process訪問,不必使用require命令加載。它是一個EventEmitter對象的實例。下面這篇文章給大家介紹了Node.js中process模塊常用的屬性和方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • nodejs基礎應用

    nodejs基礎應用

    本文主要介紹了nodejs的基礎應用。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02

最新評論