【问题标题】:Global Middleware not being triggered未触发全局中间件
【发布时间】:2021-07-18 23:15:17
【问题描述】:

服务器.ts

import express, { Request, Response, NextFunction } from 'express'
import { router } from "./routes"
import { Database } from './Database/index'

const app = express()
const db = new Database()
db.connect()
app.use(router) // contains all my routes

// The middleware I'm trying to be fired
app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
  if (err instanceof Error) {
    return res.status(400).json({
      error: err.message
    })
  }

  return res.status(500).json({
    status: 'error',
    message: 'Internal Server Error :('
  })
})

app.listen(3000, () => console.log('Server is running'))

根据Express4 Documentation

在其他 app.use() 和路由调用之后,您最后定义错误处理中间件;

所以我认为这是对的。但由于某种原因,它没有被调用/触发。

为什么它不起作用?

  • 当我尝试访问 routes.ts 中不存在的 URL 时,它会给出标准 404 错误,但我想从我的中间件中获取它。

我想将此中间件用于所有错误,但大多数用于当用户请求不存在的端点时。

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    这是因为在 404 中不是错误。这只是意味着没有匹配的路线。

    来自文档:

    在 Express 中,404 响应不是错误的结果,因此错误处理程序中间件不会捕获它们。

    这是来自docs 的默认代码。在底部添加:

    app.use(function (req, res, next) {
      res.status(404).send("Sorry can't find that!")
    })
    

    【讨论】:

    • 哎呀。我真的错过了!有没有办法让这个“不那么通用”,比如专门针对404 case? (如果这被认为是“好习惯”,我觉得很好)。谢谢!
    • 没有问题。你说的不太通用是什么意思?顺便说一句,这仅在没有找到其他匹配路由时才有效,并且最终由于.use 无论如何都会运行,这让我觉得它只适用于404 错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多