我遇到了一个无法通过简单的 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);
})
}
老实说,我不知道我做错了什么,因为请求没有返回错误
为了确保 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 验证错误现在应该作为对客户端的响应正确返回。