소켓 기반 의 긴 연결 을 위 한 express
함수 흐름 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 의 사상 을 휴식 시 키 는 데 사 용 될 뿐 실제 개발 에 사용 하려 면 단선 재 연결,최적화 연결,이상 처리 등 기능 이 필요 하 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
express를 사용하여 AWS S3 이미지에 액세스하기 위해 미리 서명된 URL을 생성하는 방법은 무엇입니까?이를 달성하는 방법 중 하나는 미리 서명된 URL을 사용하는 것입니다. However, the object owner can optionally share objects with others by creating a...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.