【问题标题】:How to handle Sequelize validation errors with proper way?如何以正确的方式处理 Sequelize 验证错误?
【发布时间】:2021-02-20 07:19:32
【问题描述】:

我正在使用 Typescript、Koa 和 Sequelize 构建简单的 REST API。

如果客户端使用空字段“title”或“author”执行无效的 PUT 请求,它会返回 500 错误。我宁愿不报告这样的错误,而是希望返回“400 Bad Request”。 这样做的正确方法是什么?

这是控制器的一部分:

import {JsonController, Get, Post, Put, Body, Param} from "routing-controllers";
import {Book} from "../models/Book";

@JsonController("/api")
export class BookController {
    @Put("/books/:id")
    async update(@Param("id") id: number, @Body() book: Book) {
        return await Book.update(book, {where: {id: id}});
    }
}

这是我使用 Sequelize 验证器作为装饰器的模型:

import {Table, Column, NotEmpty, Equals, Model, HasMany} from 'sequelize-typescript';

@Table({tableName: 'Books'})
export class Book extends Model<Book> {

    @NotEmpty
    @Column
    title: string;

    @NotEmpty
    @Column
    author: string;
}

错误信息:

"message": "Validation error: Validation notEmpty on title failed,\nValidation error: Validation notEmpty on author failed"

【问题讨论】:

  • 错误是什么类型?您可以编写一个中间件来捕获每个异常并将某些类型转换为 HTTP 400。我会使用像 application/problem+json 这样的标准格式并发出 422 Unprocessable Entity。
  • 你很幸运,我得到的只是:SequelizeUniqueConstraintError: Validation error

标签: node.js typescript sequelize.js koa sequelize-typescript


【解决方案1】:

尝试使用 ValidationFailed 挂钩

import {ValidationFailed} from 'sequelize-typescript'

@ValidationFailed
static afterValidateHook(instance, options, error) {
  throw new ErrorWithStatus(error.message, 400);
}

ErrorWithStatus 在哪里

class ErrorWithStatus extends Error {
  status: number;

  constructor(message, status = 400) {
    super(message);
    this.status = status;
}

}

【讨论】:

    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2021-10-17
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多