我正在使用Express (v4.17)在我的Nuxt.js (v2.15)项目的Nuxt.js目录中构建一个后端。
目前,我正试图在API路由中实现错误处理,特别是针对输入验证错误。Express有一个内置的默认错误处理程序,如医生们中所述。
如果您将错误传递给
next(),而您没有在自定义错误处理程序中处理该错误,则它将由内置的错误处理程序处理;该错误将使用堆栈跟踪写入客户端。生产环境中不包含堆栈跟踪。 写入错误时,将向响应中添加以下信息:
res.statusCode是从err.status (或err.statusCode)设置的。如果这个值在4xx或5xx范围之外,它将被设置为500。在此之后,我创建了一个自定义错误类:
// serverMiddleware/errors.js
class HTTPError extends Error {
constructor (status) {
super()
this.status = status
}
}
export class BadRequestError extends HTTPError {
constructor () {
super(400)
}
}我在我的路线上使用了这样的错误
// serverMiddleware/index.js
import express from "express"
import { BadRequestError } from "./errors.js"
const app = express()
app.get("/", async (req, res, next) => {
try {
// validate req
if (typeof req.query.foo !== "string") throw new BadRequestError()
res.sendStatus(200)
} catch (error) {
next(error)
}
})
export default app如果我提供foo查询属性,我将得到一个预期的200 OK。然而,如果我不提供foo,我希望得到一个400 Bad Request,但我得到一个500 Runtime Error。堆栈跟踪指向抛出BadRequestError的行。
当使用app.listen(...) 而不是 export default app 运行完全相同的代码时,在一个单独的仅限快递的项目中,没有Nuxt.js,我得到了预期的 400 Bad Request 。
为了进一步测试这一点,我创建了一个自定义错误处理程序函数来覆盖Express的默认值,并将其添加到路由和导出之间:
// serverMiddleware/index.js
app.get(...)
app.use((err, req, res, next) => {
console.error(err)
res.status(err.status || 500).send("Something broke!")
})
export default app它甚至没有达到这个功能。我得到的500响应没有任何记录错误或“什么东西坏了!”消息。它仍然只是一个指向抛出的堆栈跟踪。
再次,当在一个孤立的项目中使用这个完全相同的错误处理程序函数时,我得到了正确的400个响应,其中的“某样东西坏了!”消息.
这显然是Nuxt.js服务器中间件的一个问题,因为在一个非Nuxt项目中,一切都可以正常工作。
发布于 2021-10-30 17:17:59
内置错误处理程序设置res.statusCode,但它也调用next(error)来进一步传播错误。如果像您这样的serverMiddleware以这样的next(error)结束,Nuxt.js将拦截它并呈现错误页面(状态为500,内容类型为text/html)。
要避免这种情况,请创建自己的“最终错误处理程序”,例如
export default function (err, req, res, next) {
if (err.status) res.statusCode = err.status;
res.setHeader("content-type", "application/json");
res.end(JSON.stringify(err));
};并将其包含在nuxt.config.js中的其他中间件之后
export default {
serverMiddleware: [
"~/serverMiddleware/index",
"~/serverMiddleware/final_error_handler"
]
};https://stackoverflow.com/questions/69709998
复制相似问题