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
相关产品推荐
相关产品推荐

