You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxt3自定义事件处理包装器的使用问题(实现Server API统一异常捕获与日志记录)

Nuxt3自定义事件处理包装器的使用问题(实现Server API统一异常捕获与日志记录)

嘿,我太懂你刚接触Nuxt3就碰到这种需求的懵圈感了!刚接手项目就要给所有Server API加统一的异常捕获和Winston日志,还对着TS转JS的代码不知道咋上手,别急,我一步步给你捋明白怎么用:

第一步:先把包装器文件建好

首先在你的项目里找到server/utils目录(如果没有就新建一个),然后创建一个叫responseWrapper.js的文件,把你转好的JS代码放进去,再补充上Winston日志和统一响应格式的逻辑——毕竟原示例只是个框架,得改成符合你需求的样子:

// server/utils/responseWrapper.js
// 导入你已经配置好的Winston实例
import winston from 'winston'

export const defineWrappedResponseHandler = handler =>
  defineEventHandler(async event => {
    try {
      // 这里可以加前置操作,比如记录请求日志
      winston.info(`收到请求:${event.method} ${event.path}`)
      // 执行你原本的API业务逻辑
      const response = await handler(event)
      // 后置操作,比如记录成功响应日志
      winston.info(`请求成功:${event.method} ${event.path}`)
      // 返回统一格式的成功响应
      return {
        success: true,
        data: response
      }
    } catch (err) {
      // 重点!用Winston记录错误详情,方便排查问题
      winston.error(`请求失败:${event.method} ${event.path}`, {
        errorMessage: err.message,
        errorStack: err.stack,
        timestamp: new Date().toISOString()
      })
      // 返回统一格式的错误响应,给前端友好提示
      return {
        success: false,
        error: {
          message: err.message || '服务器内部出现错误',
          code: err.code || 500
        }
      }
    }
  })

第二步:在你的API路由里用起来

接下来就简单了,原来你写Server API的时候是直接用defineEventHandler,现在换成用我们这个包装器包裹你的业务逻辑就行,举个例子:

比如你原来的server/api/getUser.js是这么写的:

export default defineEventHandler(async (event) => {
  // 你的业务逻辑,比如从数据库拿用户数据
  const userId = event.context.params.id
  const user = await fetchUserById(userId)
  return user
})

现在改成这样,只需要导入包装器,然后把你的业务逻辑传进去:

// server/api/getUser.js
// 导入我们的包装器
import { defineWrappedResponseHandler } from '~/server/utils/responseWrapper'

export default defineWrappedResponseHandler(async (event) => {
  // 业务逻辑完全不用改,和之前一样写就行
  const userId = event.context.params.id
  const user = await fetchUserById(userId)
  return user
})

最后说点小细节

  • 所有用这个包装器的API都会自动触发try-catch,错误会被Winston记录下来,同时返回统一格式的响应,不用每个API都写一遍重复的异常处理代码啦
  • 如果某个API需要特殊的异常处理逻辑,你可以不用这个包装器,直接用原生的defineEventHandler,灵活性拉满
  • 确保你的Winston配置是正确的哦,比如日志文件的路径、格式这些,不然可能看不到日志输出

备注:内容来源于stack exchange,提问作者fudo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 07:34:53