如何使用Sequelize的bulkCreate批量插入带userId的数据?
解决Sequelize bulkCreate批量添加userId的问题
问题背景
需要使用Sequelize的bulkCreate批量存入数组格式的数据,要求为每条数据自动添加userId(用于关联其他表),但当前代码报错,错误提示:
Argument of type '{ userId: any; length: number; toString(): string; ... }' is not assignable to parameter of type 'object[]'. Object literal may only specify known properties, and 'userId' does not exist in type 'object[]'
错误原因
- 参数类型错误:
bulkCreate要求传入对象数组,但当前代码{ ...request, userId }是将数组request展开为单个对象,再附加userId,得到的是一个包含数组所有方法和userId的混合对象,不符合bulkCreate的参数要求。 - 实体缺少字段:
Request实体中未定义userId字段,即使参数格式正确,也无法存入数据库。
解决方案
步骤1:在Request实体中添加userId字段
首先要在requests.entity.ts中补充userId的列定义(如果需要关联User表,同时添加外键和关联关系):
@Table export class Request extends Model<Request> { // 原有字段... // 添加userId字段 @ForeignKey(() => User) // 替换为实际关联的用户模型 @Column({ type: DataType.INTEGER, allowNull: false, }) userId: number; @BelongsTo(() => User) // 建立与User模型的关联 user: User; }
步骤2:修改service层代码,正确批量添加userId
在requests.service.ts中,遍历传入的RequestDto数组,为每个对象添加userId属性,生成符合要求的对象数组后,再传入bulkCreate:
async createRecurrent(request: RequestDto[], userId): Promise<Request[]> { // 遍历数组,给每个元素添加userId const requestsWithUserId = request.map(item => ({ ...item, userId: userId })); // 将处理后的对象数组传入bulkCreate return await this.requestRepository.bulkCreate<Request>(requestsWithUserId); }
可选:更新RequestDto(非必需)
如果需要前端也能传入userId(当前需求为后端自动添加,此步骤可选),可以在requestDto.ts中添加userId字段:
export class RequestDto { // 原有字段... @IsOptional() // 后端自动添加,设为可选字段 readonly userId: number; }
代码验证
修改后,传入示例数组时,每个对象都会被自动添加上userId,最终生成的数组格式如下:
[ { description: 'Pasta', creator: 'Andre', messageHelper: '', startDatetime: '2023-04-08T11:00:00', endDatetime: '2023-04-08T11:30:00', type: 'todo', groupId: 21, userId: 1 // 自动添加的userId }, // 其他对象同理... ]
该格式符合bulkCreate的参数要求,能够正常批量存入数据库。
内容的提问来源于stack exchange,提问作者DaiXus
相关产品推荐
相关产品推荐

