如何封装 node 中间件

如何封装 node 中间件

如何封装 node 中间件

  • 在 NodeJS 中,中间件主要是指封装所有 http 请求细节处理的方法
  • 一次 http 请求通常包含很多工作
    • 记录日志、ip过滤、查询字符串、请求体解析、Cookie处理、权限验证、参数验证、异常处理
    • 但对于 Web 应用而言,并不希望接触到这么多细节性的处理
    • 因此引入中间件来简化和隔离这些基础设施与业务逻辑之间的细节
    • 让开发者能够关注在业务的开发上,以达到提升开发效率的目的
  • 中间件的行为比较类似 Java 中过滤器的工作原理,就是在进入具体的业务处理之前,先让过滤器处理
const http = require('http')
function compose(middlewareList) {
  return function (ctx) {
    function dispatch (i) {
      const fn = middlewareList[i]
      try {
        return Promise.resolve(fn(ctx, dispatch.bind(null, i + 1)))
      } catch (err) {
        Promise.reject(err)
      }
    } 
    return dispatch(0)
  }
}
class App {
  constructor(){
    this.middlewares = []
  }
  use(fn){
    this.middlewares.push(fn)
    return this
  }
  handleRequest(ctx, middleware) {
    return middleware(ctx)
  }
  createContext (req, res) {
    const ctx = {
      req,
      res
    }
    return ctx
  }
  callback () {
    const fn = compose(this.middlewares)
    return (req, res) => {
      const ctx = this.createContext(req, res)
      return this.handleRequest(ctx, fn)
    }
  }
  listen(...args) {
    const server = http.createServer(this.callback())
    return server.listen(...args)
  }
}
module.exports = App
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Node.js 中间件,用于验证 JSON Web Token(JWT): ```javascript const jwt = require('jsonwebtoken'); function verifyJWT(req, res, next) { const token = req.headers.authorization; if (!token) { return res.status(401).json({ message: 'Missing token' }); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded.user; next(); } catch (error) { return res.status(401).json({ message: 'Invalid token' }); } } module.exports = verifyJWT; ``` 该中间件接受一个包含 JWT 的请求头,然后验证该 JWT 是否有效。如果有效,解码的用户对象将添加到请求对象上,并且 `next()` 函数将被调用以允许请求继续向下执行。如果 JWT 无效或不存在,则返回一个错误响应。 为了使用该中间件,您可以将其导入到您的应用程序中,并在需要验证 JWT 的路由上使用它,如下所示: ```javascript const express = require('express'); const verifyJWT = require('./verify-jwt'); const app = express(); app.get('/protected-route', verifyJWT, (req, res) => { res.json({ message: 'You are authorized!' }); }); app.listen(3000, () => { console.log('Server started on port 3000'); }); ``` 在上面的示例中,`/protected-route` 是一个需要验证 JWT 的受保护路由。当请求到达该路由时,它将被传递给 `verifyJWT` 中间件进行验证。如果 JWT 有效,则请求将继续向下执行,并返回一个成功响应。如果 JWT 无效,则中间件将返回一个错误响应,请求将不会继续执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值