使用fastify在nodejs中处理错误的问题

问题描述 投票:0回答:1

我遇到了一个无法通过简单的 Nodejs 错误处理来解决的问题。因为错误仅在终端中报告,但不会随请求作为响应返回。 最终发生的情况是,在我的路线中,如果我遇到 zod 失败并给出错误,我期望它在请求中返回错误,但事实并非如此。


import { CreateUserService } from "./CreateUserService";
import z, { ZodError } from "zod";

import { FastifyReply, FastifyRequest } from "fastify";

class CreateUserController {
    constructor(private createUser: CreateUserService){}
    async handle(request: FastifyRequest, reply : FastifyReply){
       
        const schema = z.object({
            name: z.string(),
            address: z.string(),
            cellNumber: z.string().min(8)
        })
       
      
        const {name, address, cellNumber} =schema.parse(request.body)
      
       
       
        const user = await this.createUser.execute({name,address,cellNumber});
        return reply.send(user)
    }
}

export {CreateUserController};

这是我的 createUserController,其中当我发送 zod 期望的 json 时出现错误缺少一些数据,该错误在服务器终端中报告,即使我创建了一个用于错误处理的中间件,它也没有定向到那里。 但是,如果我在路由器中实现验证就可以了:


import { FastifyInstance } from "fastify";
import { createUserFactory } from "../modules/createUser/CreateUSerFactory";
import {z} from 'zod'

export  async function router (app:FastifyInstance){
    app.get("/", (request,reply)=>{
        return reply.send("OK")`your text`
    })

    app.post('/user',(request,reply)=>{
        const schema = z.object({
            name: z.string(),
            address: z.string(),
            cellNumber: z.string().min(8)
        })
        const {name, address, cellNumber} =schema.parse(request.body)
    
  //  createUserFactory().handle(request,reply);
})
}

老实说,我不知道我做错了什么,因为请求没有返回错误

javascript node.js typescript error-handling fastify
1个回答
0
投票

为了确保 Zod 验证中的错误得到正确处理并作为响应返回给客户端,您需要捕获 schema.parse 抛出的 ZodError 并将适当的响应发送回客户端。以下是如何修改 CreateUserController 来处理 Zod 错误:

import { CreateUserService } from "./CreateUserService";
import z, { ZodError } from "zod";
import { FastifyReply, FastifyRequest } from "fastify";

class CreateUserController {
    constructor(private createUser: CreateUserService) {}

    async handle(request: FastifyRequest, reply: FastifyReply) {
        const schema = z.object({
            name: z.string(),
            address: z.string(),
            cellNumber: z.string().min(8)
        });

        try {
            const { name, address, cellNumber } = schema.parse(request.body);
            const user = await this.createUser.execute({ name, address, cellNumber });
            return reply.send(user);
        } catch (error) {
            if (error instanceof ZodError) {
                // Zod validation error occurred
                const validationErrors = error.errors.map((err) => ({
                    message: err.message,
                    path: err.path
                }));
                return reply.status(400).send({ errors: validationErrors });
            } else {
                // Other unexpected errors
                console.error("Unexpected error:", error);
                return reply.status(500).send({ error: "Internal Server Error" });
            }
        }
    }
}

export { CreateUserController };

我使用 try-catch 块来捕获 Zod 验证期间可能发生的错误。 如果捕获到 ZodError,则意味着存在验证错误。我们提取错误消息和路径,并将其以 400 Bad Request 状态发送回客户端。 如果发生意外错误(与 Zod 验证无关),我们会记录该错误并发送通用 500 内部服务器错误响应。 通过此修改,Zod 验证错误现在应该作为对客户端的响应正确返回。

© www.soinside.com 2019 - 2024. All rights reserved.