You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Hyperledger Fabric TypeScript链码部署报错MissingRefError:无法解析PatientModel的Object引用

Hyperledger Fabric TypeScript链码部署报错MissingRefError:无法解析PatientModel的Object引用

看起来你碰到的这个MissingRefError是链码运行时解析装饰器元数据时出了问题,我之前在Fabric 2.5的TypeScript链码中也踩过这个坑,主要是两个核心原因:装饰器命名冲突TypeScript编译配置缺失,下面给你一步步的解决办法:

一、解决装饰器命名冲突问题

你当前从fabric-contract-api导入的Object装饰器和JavaScript全局的Object构造函数重名了,这会导致链码在生成JSON Schema做数据验证时,错误地把装饰器解析成全局Object类型,从而触发"无法解析引用Object"的错误。

修改你的PatientModel代码,给装饰器重命名避免冲突:

// 把导入的Object重命名为FabricObject,避开全局Object的命名冲突
import { Object as FabricObject, Property } from 'fabric-contract-api';

@FabricObject()
export class PatientModel {
  @Property()
  public docType?: string = 'patient';

  @Property()
  public patientId: string = '';

  @Property()
  public fullName: string = '';

  @Property()
  public dateOfBirth: string = '';

  @Property()
  public gender: string = '';
}

二、检查并修正TypeScript编译配置

Fabric的TypeScript链码必须开启装饰器相关的编译选项,否则装饰器的元数据不会被正确生成和保留,运行时自然无法解析。确保你的tsconfig.json包含以下关键配置:

{
  "compilerOptions": {
    "target": "ES2020", // 匹配Node.js 18的支持版本
    "module": "CommonJS",
    "lib": ["ES2020"],
    "declaration": true,
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "outDir": "./dist", // 和package.json中的main字段路径对应
    "rootDir": "./src",
    "experimentalDecorators": true, // 必须开启,支持装饰器语法
    "emitDecoratorMetadata": true, // 必须开启,生成装饰器元数据
    "resolveJsonModule": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

三、重新编译并部署链码

完成上述修改后,按以下步骤重新部署(清理缓存避免旧影响):

  1. 先删除之前的链码容器和镜像(可选但推荐):
    docker rm -f dev-peer0.org1.example.com-medical_1.0-*
    docker rmi dev-peer0.org1.example.com-medical_1.0-*
    
  2. 重新编译TypeScript代码:
    npm run build
    
  3. 重新部署链码:
    ./network.sh deployCC -ccn medical -ccp ../chaincode -ccl typescript
    

额外排查点

如果还是报错,可以再检查这几点:

  • 确保fabric-contract-apifabric-shim的版本和Fabric节点版本严格匹配(你用的~2.5对应Fabric 2.5.x,是没问题的)
  • 确认链码package.jsonmain字段指向正确的编译后入口文件(你的是dist/src/index.js,要保证src/index.ts是链码入口,正确导出PatientContract
  • 你的Node.js版本18.20.8和fabric-nodeenv:2.5是兼容的,这部分不用调整

内容来源于stack exchange

火山引擎 最新活动