Express 중간부품의 간단한 실현 원리
우리는 Express 중간부품이 하나의 함수라는 것을 알고 있다. 그러면 어떻게 이 함수들을 질서정연하게 집행할 수 있습니까?그러면 우리가
next
함수를 호출해야 한다.사실 next
함수는 다음 중간부품 함수를 호출한다.다음 코드는 간단한
app.use
등록 중간부품과 get
, post
방식의 중간부품을 실현했다.기타 요청 방식의 중간부품은 같은 이치를 실현한다핵심 코드:
const next = () => {
const stack = stacks.shift()
if(stack) {
stack(req, res, next)
}
}
next()
stacks는 규칙에 부합되는 모든 중간부품 함수를 저장하는 그룹 대기열입니다.
의 원칙을 따르다.즉 가장 먼저 등록된 중간부품 함수가 가장 먼저 실행되는 것이다.구현 코드
const http = require('http')
const slice = Array.prototype.slice
class Express {
constructor() {
this.router = {
all: [], //
get: [],
post: []
}
}
/**
*
* @param {string} path
* @returns {object}
*/
middlewareHandler(path) {
const info = {}
if (typeof path === 'string') {
info.path = path
info.stack = slice.call(arguments, 1) //
} else {
info.path = '/'
info.stack = slice.call(arguments, 0)
}
return info
}
use() {
const allStack = this.middlewareHandler(...arguments)
this.router.all.push(allStack)
}
get() {
const getStack = this.middlewareHandler(...arguments)
this.router.get.push(getStack)
}
post() {
const postStack = this.middlewareHandler(...arguments)
this.router.post.push(postStack)
}
/**
*
* @param {string} method
* @param {string} url
* @returns {Array}
*/
accordStack(method, url) {
let stacks = []
stacks = stacks.concat(this.router.all)
stacks = stacks.concat(this.router[method])
return stacks
.filter(stack => {
return url.indexOf(stack.path) !== -1
}).map(item => item.stack[0])
}
handler(req, res, stacks) {
//
const next = () => {
const stack = stacks.shift()
if(stack) {
stack(req, res, next)
}
}
next()
}
callback() {
return (req, res) => {
res.json = data => {
res.setHeader('Content-Type', 'application/json')
res.end(JSON.stringify(data))
}
// url,
const {method, url} = req
const stacks = this.accordStack(method.toLowerCase(), url)
this.handler(req, res, stacks)
}
}
listen(...args) {
const server = http.createServer(this.callback())
server.listen(...args)
}
}
// ,
module.exports = () => {
return new Express()
}
전재 대상:https://www.cnblogs.com/qiqingfu/p/10893513.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.