请说明在 Express 框架中,针对未匹配到任何路由的请求,应当采用何种方式来处理并返回 404 响应?
考察说明
考查对 Express 中间件机制和错误处理流程的理解,以及常见 404 场景的处理方式。
回答思路
- 【回答框架 1】Express 中 404 处理的核心是中间件机制。在 Express 中,所有未匹配到路由的请求都会沿着中间件栈继续向后传递,最终如果没有相应的处理,就会由默认的 finalhandler 返回 404。为了自定义 404 响应,可以在所有路由注册之后,添加一个普通的中间件函数,该函数不检查任何路径,对任何请求直接返回 404 状态码,并可以附带自定义的响应体。
- 【回答框架 2】典型的实现方式是在所有路由之后,调用 app.use() 注册一个不接受路径参数的中间件,例如 app.use(function(req,res){ res.status(404).send('Not Found') })。这个中间件会捕获所有未被前面路由处理的请求,并设置状态码为 404。
- 【回答框架 3】如果需要更完整的错误处理,可以利用 Express 的错误处理中间件,该中间件有四个参数(err, req, res, next),通常放在所有中间件的最后。但注意,错误处理中间件主要用于处理 next(err) 传入的错误,而 404 是正常的中间件流结果,不是错误对象,所以通常 404 用普通中间件处理。
- 【回答框架 4】另外,对于 API 接口,可能还需要根据请求的 Accept 头返回 JSON 格式的 404 响应,例如 res.status(404).json({ error: 'Not Found' })。
- 【关键点 1】404 处理通过在所有路由之后注册一个普通中间件实现。
- 【关键点 2】该中间件不接收路径参数,对所有请求返回 404 状态码。
- 【关键点 3】错误处理中间件(四参数)与 404 中间件不同,用于处理 next(err) 传入的错误。
- 【易错点 1】将 404 中间件放在路由之前会导致所有请求都返回 404。
- 【易错点 2】使用错误处理中间件直接返回 404 可能无法捕获未传入 next(err) 的请求。
- 【易错点 3】若未自定义 404,默认响应体可能不符合项目需求。