首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Nuxt.js serverMiddleware中无法工作的快速错误处理

在Nuxt.js serverMiddleware中无法工作的快速错误处理
EN

Stack Overflow用户
提问于 2021-10-25 14:37:55
回答 1查看 1.1K关注 0票数 2

我正在使用Express (v4.17)在我的Nuxt.js (v2.15)项目的Nuxt.js目录中构建一个后端。

目前,我正试图在API路由中实现错误处理,特别是针对输入验证错误。Express有一个内置的默认错误处理程序,如医生们中所述。

如果您将错误传递给next(),而您没有在自定义错误处理程序中处理该错误,则它将由内置的错误处理程序处理;该错误将使用堆栈跟踪写入客户端。生产环境中不包含堆栈跟踪。 写入错误时,将向响应中添加以下信息:

  • res.statusCode是从err.status (或err.statusCode)设置的。如果这个值在4xx或5xx范围之外,它将被设置为500。

在此之后,我创建了一个自定义错误类:

代码语言:javascript
运行
复制
// serverMiddleware/errors.js

class HTTPError extends Error {
  constructor (status) {
    super()
    this.status = status
  }
}

export class BadRequestError extends HTTPError {
  constructor () {
    super(400)
  }
}

我在我的路线上使用了这样的错误

代码语言:javascript
运行
复制
// 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的默认值,并将其添加到路由和导出之间:

代码语言:javascript
运行
复制
// 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项目中,一切都可以正常工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-30 17:17:59

内置错误处理程序设置res.statusCode,但它也调用next(error)来进一步传播错误。如果像您这样的serverMiddleware以这样的next(error)结束,Nuxt.js将拦截它并呈现错误页面(状态为500,内容类型为text/html)。

要避免这种情况,请创建自己的“最终错误处理程序”,例如

代码语言:javascript
运行
复制
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中的其他中间件之后

代码语言:javascript
运行
复制
export default {
  serverMiddleware: [
    "~/serverMiddleware/index",
    "~/serverMiddleware/final_error_handler"
  ]
};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69709998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档