美文网首页
如何写一个类express使用中间件的方法

如何写一个类express使用中间件的方法

作者: 枸杞辣条 | 来源:发表于2017-11-26 18:12 被阅读130次

我们是如何使用express的中间件的呢?
代码

const express = require('express')
const app = express()
const http = require('http')

app.use(middleware)

const server = http.createServer(app())
server.listen(8000,()=>{
   console.log('server run 8000')
})

// 我们来写一个

class App{
  constructor(){
    this.middlewareList=[]
  }
  use(middleware){
    this.middlewareList.push(middleware)
  }
  compose(){
      this.middlewareList.forEach(middleware=>{
            //依次执行middleaware
            middleware()
      })
   }
  init(){
        return (req,res)=>{
            this.compose()
        }
  }
}
const app = new App()
const http = require('http')

app.use(middleware)

const server = http.createServer(app.init())
server.listen(8000,()=>{
   console.log('server run 8000')
})

这样操作一看还是可以的,但是最重要的异步我们却没办法处理

所以,我们可以创建primise链条来进行所有中间件的连接

需求很简单。访问
/ === middleware1 返回index.html文件
/list === middleware2 返回一个简单的字符串

// index.js
const App = require('./app')
const app = new App()

const http = require('http')
const middleware1 = require('./middleware1')
const middleware2 = require('./middleware2')

app.use(middleware1)
app.use(middleware2)

const server = http.createServer(app.init((req, res) => {
// 执行最终的回调
  const endData = res.getHtml ? res.getHtml : res.getList
  res.end(endData)
}))

server.listen(8000, () => {
  console.log('server run in 8000')
})


// app.js
module.exports = class App {
  constructor() {
    this.middlewareChain = Promise.resolve()
    this.middlewareList = []
  }

  use(middleware) {
    // 创建中间件list
    this.middlewareList.push(middleware)
  }

  compose(req, res) {
    this.middlewareList.forEach((middleware) => {
      // 连接中间件
      this.middlewareChain = this.middlewareChain.then(() => {
        // 传递上下文到中间件
        // 中间件执行之后每个中间件都是类似new Promise((res,rej)=>{...// to do })
        return middleware(req, res)
      })
    })

    return this.middlewareChain
  }

  init(callback) {
    return (req, res) => {
      // 启动中间件
      this.compose(req, res).then(() => {
        // 回调
        callback(req, res)
      }).catch(() => {
        res.end('<h1 style="color:red;">request error</h1>')
      })
    }
  }
}
// 中间件1  middleware 1
const fs = require('fs')
const path = require('path')

module.exports = (req, res) => {
  console.log('hello world')
  return new Promise((resolve, reject) => {
    if (req.url === '/') {
      const filePath = path.resolve(__dirname, './index.html')
      fs.readFile(filePath, 'utf-8', (err, data) => {
        res.getHtml = data
        resolve()
      })
    }
  })
}
// middleware2
module.exports = (req, res) => {
  return new Promise((resolve, reject) => {
    console.log(req.url === '/list', '====')
    if (req.url === '/list') {
      res.getList = '<h1>middleware2</h1>'
      resolve()
    } else {
      resolve()
    }
  })
}
2E20ECB0-1459-4722-B9AA-37A87ED7909A.png 08E1E050-60D4-464B-A368-AAC4CC133BD5.png

相关文章

  • Express源码书写

    Express基本使用 express是一个函数,koa是类 express中的中间件可以放置路径,路径的规则和c...

  • 如何写一个类express使用中间件的方法

    我们是如何使用express的中间件的呢?代码 // 我们来写一个 这样操作一看还是可以的,但是最重要的异步我们却...

  • Node之中间件

    中间件概述 Express框架中一个非常重要的概念——中间件。在Express框架中,允许通过中间件的使用来调用各...

  • 访问静态文件 static-file 中间件

    作为express 中间件使用

  • 简单实现node中间件机制-仿express

    express中间件机制原理 首先,我们看一下express使用是怎么使用中间件的。 其实app.use()原理很...

  • node express 如何让每个api都添加token验证

    我用到的方法是自己手写的中间件,也可以使用express-jwt中间件进行验证 封装一个中间件然后暴露出去 定义并...

  • express中的app.use

    这里说的app,是指express对象 其中,app.use是express“调用中间件的方法”。所谓“中间件(m...

  • Express中间件

    Express框架是由路由和中间件构成的一个web开发框架。 1. Express 中间件 中间件是Express...

  • Express学习

    使用中间件 Express 应用可使用如下几种中间件:* 应用级中间件* 路由级中间件* 错误处理中间...

  • node.js的Express框架

    Express框架 [TOC] 基础用法: 三种获取请求的方法 express-static中间件

网友评论

      本文标题:如何写一个类express使用中间件的方法

      本文链接:https://www.haomeiwen.com/subject/sbnwvxtx.html