這篇文章主要介紹了如何實(shí)現(xiàn)長(zhǎng)連接的express,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元袁州做網(wǎng)站,已為上家服務(wù),為袁州各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
邏輯: 首先把routerUrl目錄下的函數(shù)初始化緩存起來(lái),通過(guò)Router.request調(diào)用緩存起來(lái)的函數(shù),這個(gè)函數(shù)實(shí)際上是register.set方法,主要是開(kāi)始運(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ù),開(kāi)始運(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); } });
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“如何實(shí)現(xiàn)長(zhǎng)連接的express”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
分享標(biāo)題:如何實(shí)現(xiàn)長(zhǎng)連接的express
文章地址:http://jinyejixie.com/article30/poseso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、域名注冊(cè)、微信公眾號(hào)、云服務(wù)器、ChatGPT、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)