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

Hyperledger Composer字符串匹配查询问题:查询语句无结果求助

解决Hyperledger Composer查询无结果的问题

嗨,咱们来排查下你的Hyperledger Composer查询为啥没返回结果——我发现这里有几个关键问题大概率是罪魁祸首:

1. 关联字段的匹配方式错了!

你的IdentityProof资产里的owner是指向Owner资产的关联引用,不是普通字符串,所以直接用owner == _$owner是匹配不到的。在Composer中,要匹配关联资产,得用它的唯一标识符字段(比如Owner资产里的userId或者你定义的其他ID字段)来对比。

举个例子,如果你的Owner资产是这么定义的:

asset Owner identified by userId {
  o String userId
  // 其他字段比如姓名、邮箱等
}

那你的查询语句得改成这样:

SELECT org.example.identitynetwork.IdentityProof 
WHERE ((owner.userId == _$ownerId) AND (proofName == _$proofName))

这里用owner.userId来精准匹配Owner的唯一ID,而不是直接对比关联对象本身。

2. 检查参数传递是否对应

你在logic.js里传的owner参数,如果是Owner的ID字符串,那得和查询里的参数名对应上。比如上面的查询用了_$ownerId,那调用代码要改成:

let idProofs = await query('selectRequestedIdProofsByOwner', { 
  "ownerId": proofOwner, // 这里proofOwner要是Owner的ID字符串,比如"user_001"
  "proofName": proofName 
});

如果proofOwner已经是一个从别处获取的Owner对象,那直接传proofOwner.userId就行,确保参数是正确的标识符值。

3. 字符串匹配的大小写问题

Hyperledger Composer的字符串匹配是大小写敏感的,要确认你传的proofName和资产里存的proofName完全一致(包括大小写、空格、特殊字符)。如果需要模糊匹配,可以用CONTAINS关键字,比如:

SELECT org.example.identitynetwork.IdentityProof 
WHERE ((owner.userId == _$ownerId) AND (CONTAINS(proofName, _$proofName)))

4. 额外的排查小技巧

  • 先去Composer Playground里手动测试这个查询,输入参数看看能不能返回结果——这样能快速区分是查询语句的问题,还是代码调用的问题。
  • 检查查询文件(.qry)里的查询名称selectRequestedIdProofsByOwner和你在logic.js里调用的名称完全一致,大小写也不能错。
  • 确认每个IdentityProofowner关联都正确指向了存在的Owner资产,没有空引用或者错误的ID。

最后给你一个完整的示例参考:

完整CTO定义(补充Owner)

asset Owner identified by userId {
  o String userId
  o String userName
}

asset IdentityProof identified by proofId { 
  o String proofId 
  o String proofName 
  o String encodedData 
  --> Owner owner 
}

查询文件(selectRequestedIdProofsByOwner.qry)

query selectRequestedIdProofsByOwner {
  description: "根据Owner ID和凭证名称查询IdentityProof"
  statement: 
    SELECT org.example.identitynetwork.IdentityProof 
    WHERE ((owner.userId == _$ownerId) AND (proofName == _$proofName))
}

logic.js中的调用代码

// 假设proofOwner是获取到的Owner ID字符串,比如"user_001"
let idProofs = await query('selectRequestedIdProofsByOwner', { 
  "ownerId": proofOwner, 
  "proofName": proofName 
});

console.log(`找到${idProofs.length}个匹配的凭证`);

这样调整后,应该就能正确返回你要的结果啦~

内容的提问来源于stack exchange,提问作者krupal.agile

火山引擎 最新活动