Medusa JS中Cart模型自定义字段无法通过Store API更新至数据库
问题排查与解决方案
1. 修正TypeScript声明文件
你当前的声明文件错误地扩展了Order模型,但实际需要扩展的是Cart模型。修改声明文件路径和接口:
// src/types/cart.d.ts export declare module "@medusajs/medusa/dist/models/cart" { declare interface Cart { is_subscribed?: boolean; } }
2. 调整实体列的可选配置
确保数据库列允许为空,避免因字段非空约束导致静默失败:
// src/models/cart.ts import { Column, Entity } from "typeorm"; import { Cart as MedusaCart } from "@medusajs/medusa"; @Entity() export class Cart extends MedusaCart { @Column({ nullable: true, default: false }) is_subscribed?: boolean; }
3. 重写Cart更新服务以处理自定义字段
核心的Cart更新服务不会自动处理新增字段,需要重写CartService的update方法,将传入的自定义字段同步到数据库:
// src/services/cart.ts import { CartService as MedusaCartService } from "@medusajs/medusa"; import { EntityManager } from "typeorm"; import { Cart } from "../models/cart"; class CartService extends MedusaCartService { async update( cartId: string, data: Record<string, any> ): Promise<Cart> { // 提取自定义字段 const { is_subscribed, ...rest } = data; // 调用父类方法处理核心字段 const cart = await super.update(cartId, rest) as Cart; // 如果传入了自定义字段,更新并保存 if (is_subscribed !== undefined) { const manager: EntityManager = this.activeManager_; await manager.update(Cart, cartId, { is_subscribed }); // 更新返回的cart对象属性 cart.is_subscribed = is_subscribed; } return cart; } } export default CartService;
4. 执行数据库迁移并重启服务
修改实体结构后,需要运行数据库迁移来同步字段到数据库:
npx medusa migrations run
完成后重启Medusa服务,测试Store API的更新请求。
内容的提问来源于stack exchange,提问作者atinfosec
相关产品推荐
相关产品推荐

