1.smtp在使用qq邮箱时 ssl=false,端口是587, ssl=ture,端口是465
SMTP_HOST=smtp.qq.com
SMTP_USER=yourEmail
SMTP_PASSWORD=设置的授权码
SMTP_SSL=false
SMTP_PORT=587
SMTP_FROM=yourName<yourEmail>
2.遇到 Data truncated for column?的情况,可能是你的数据库还没更新到最新情况 比如这次:我在开发中给type: 'enum'增加了一种情况'register',插入数据时报这个错误。这里是因为我数据库中这个字段还没有'register'
我想要 relation[field] = item报了这个类型定义的错误
改成 (relation as any)[field] = item
解释不出来,主要是类型定义的时候是[key: string]: any;但是使用[field]赋值时就会报
4.typeorm的update可以使用save相互替代,update需要所有数据,save要对象
Repo.update(relation.id, {
[field]: item
}
替换成
(relation as any)[field] = item;
await Repo.save(relation);
5.使用typeorm更新数据
1)当many-to-many或者one-to-many关系的时候,即外键在另一张表上,使用addAndRemove去更新关联数据
await this.repository
.createQueryBuilder('deal')
.relation(DealEntity, 'categories')
.of(deal)
.addAndRemove(categories, deal.categories ?? []);
2)当many-to-one时,即外键在当前这张表上,使用update更新
await this.repository.update(id, {
...data,
brand: await this.brandRepository.findOneByOrFail({ id: brand }),
});
3)当OneToOne时,外键在另一张表上,只需要修改外键表的逻辑,需要先移除老表内容,在保存外键信息
//image是新图片id, current是当前图片的对象,
await this.mediaRepository.remove(deal.image);
const current = await this.mediaRepository.findOneByOrFail({ id: image });
current.deal = deal;
await this.mediaRepository.save(current);
6.typeorm外键在哪张表上 1)当one-to-many和many-to-one时,不会生成外键, 但逻辑在many表 2)当one-to-one时,外键在JoinColumn这张表上 3) 当many-to-many时,会生成中间表,2个表都有外键在中间表上,中间表的排前面的id是JoinTable决定的
7.like和AGAINST的用法
表的引擎是InnoDB时,即使设置了FULLTEXT,也会报Can't find FULLTEXT index matching the column list或者搜索不到东西。 表的引擎改成MyISAM,才能正常使用AGAINST
like
优点:全文搜素,准确,使用简单
缺点:性能消耗大,如果是长文的话,会慢
AGAINST
优点:长文速度比like好一点
缺点:难用
qb2.where('title like :search', { search: `%${search}%` })
qb2.where('MATCH(title) AGAINST (:search IN BOOLEAN MODE)', { search })
如果搜索部分的数据量大可以上elasticsearch, 如果是文档可以上Algolia DocSearch,
8.typeorm使用orderBy遇上typeorm ERROR [ExceptionsHandler] Cannot read properties of undefined (reading 'databaseName')
原因是我有个参数isTop是boolean
代码写成 qb.addOrderBy('deal.isTop = 1', 'DESC');就会报错
写成qb.addOrderBy('deal.isTop', 'DESC');就能通过编译
mysql里下面两种都能通过,当typeorm中这样写会报错
SELECT * FROM content_deal ORDER BY isTop = 1 desc, createdAt desc
SELECT * FROM content_deal ORDER BY isTop desc, createdAt desc
9.使用class-validator验证空值 前端搜索条件 空值不走validator流程,非空值走validator流程
@ValidateIf((value) => isNilAdd(value))
@IsModelExist(ShopEntity, {
always: true,
message: '商品不存在',
})
@IsUUID(undefined, {
always: true,
message: '商品ID格式不正确',
})
ValidateIf函数返回为false,才会继续走剩下的validator流程