gpt4 book ai didi

typescript - 类验证器使用 createQueryBuilder 意外触发验证

转载 作者:行者123 更新时间:2023-12-03 20:50:05 24 4
gpt4 key购买 nike

我正在使用 Typeorm结合 class-validator ,所以我定义了一个这样的实体:

import {
Entity,
PrimaryGeneratedColumn,
Column,
BaseEntity,
BeforeInsert,
BeforeUpdate,
getRepository
} from "typeorm";
import {
validateOrReject,
IsDefined,
} from "class-validator";
import errors from 'restify-errors';

@Entity()
export class License extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
public id!: string;

@Column({ nullable: false })
@IsDefined({ message: 'name field was not provided' })
public name!: string;

@Column({ nullable: false })
@IsDefined({ message: 'description field was not provided' })
public description!: string;

@BeforeInsert()
@BeforeUpdate()
async validate() {
await validateOrReject(this, { skipUndefinedProperties: true });

// Check if license already exists
if ((await getRepository(License).count({ name: this.name }) > 0))
throw new errors.BadRequestError(`There is already a license with name of ${this.name}`);
}
}
我还定义了一个运行 getMany 的中间件从 Entity<T> 检索数据存储库,例如:
export default (entity: any) => async (req: Request, res: Response, next: Next) => {
const repository = getRepository(entity);
const query = repository.createQueryBuilder(`${entity}`);

// Get query params
for (const propName in req.params) {
if (req.params.hasOwnProperty(propName)) {
query.where(`${propName} = :param`, { param: req.params[propName] });
}
}

// Pagination
const page = parseInt(req.query.page, 10) || 1;
const limit = parseInt(req.query.limit, 10) || 25;
const startIndex = (page - 1) * limit;
const endIndex = page * limit;

const [result, total] = await query
.skip(startIndex)
.take(endIndex)
.getManyAndCount();

res.send({
"success": true,
"data": result,
"count": total,
"message": null
});

next();
};
当我运行中间件时,函数 async validate()也被触发,但不应该因为我正在获取数据而不是插入或更新它们。
事实上,当 validate方法被触发, Typeorm产生这个错误:

"QueryFailedError: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'is already a license with name of ${this.name});\r\n });\r\n }\r\n}.id A' at line 12"


如果我评论功能 validate ,数据从中间件正确返回。
到底是怎么回事?这是图书馆的错误吗?

最佳答案

您的中间件似乎在您的查询中使用了以下消息:There is already a license with name of ${this.name} .如果没有进一步说明您如何将中间件与 restify(server.use 语句)一起使用,则很难说明此错误消息有效负载如何以及为何以您的中间件查询结束,但您应该检查这个方向。
另一方面,如果您需要确保许可证名称的唯一性,您可能需要在 name 上声明一个唯一的 key 。使用以下符号而不是使用手动验证:

@Column({ nullable: false, unique: true })
public name!: string;
请在 typeorm 文档中找到更多信息: https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#column

关于typescript - 类验证器使用 createQueryBuilder 意外触发验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63337964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com