Javascript 如果查询有多个输入,如何在Hyperledger composer logic.js中使用查询?

Javascript 如果查询有多个输入,如何在Hyperledger composer logic.js中使用查询?,javascript,hyperledger-composer,Javascript,Hyperledger Composer,对于logic.js中的查询,我可以使用 await query('selectCommoditiesWithHighQuantity') 但是如果我有多个输入,我怎么能做到呢? 如果查询有这样的函数 query selectCommoditiesByTimeAndOwnerAndDataType { description: "Select all commodities based on their sender country" statement: SELECT o

对于logic.js中的查询,我可以使用

await query('selectCommoditiesWithHighQuantity')
但是如果我有多个输入,我怎么能做到呢? 如果查询有这样的函数

query selectCommoditiesByTimeAndOwnerAndDataType {
  description: "Select all commodities based on their sender country"
  statement:
      SELECT org.stock.mynetwork.Commodity
          WHERE(time  > _$from AND time < _$to AND owner == _$owner AND dataType == _$dataType)
}

let result2=wait query(q1,{productName:receive.productName,owner:receive.newOwner})有问题零件。如果我只使用
productName:receive.productName
它工作得很好,但是当我添加
owner:receive.newOwner
时,它需要序列化.json

以便您可以在
.qry
文件中编写查询并调用它,但我不建议这样做。您可以直接从SDK和
logic.js
文件中进行相同的查询。这背后的原因是,比如说几天后,您想添加一个新的API来查询特定的值,如果您依赖
.qry
文件(这将起作用),那么您将需要部署一个新版本的smart contact,而如果您使用SDK,您可以对API进行更改并尽快部署一个新的应用程序服务器

async function someTransaction(receive) {
  let assetRegistry = await getAssetRegistry('YOUR_NAME_SPACE');
  let ownerRegistry = await getParticipantRegistry('YOUR_NAME_SPACE');

  let statement = 'SELECT NAME_SPACE_OF_ASSET WHERE (owner == _$owner && dataType == _$dataType)';
  let qry = buildQuery(statement);

  // This query can be done in different ways
  // assuming newOwner is a string (id of participant)
  let allAssets = await query(qry, { owner: receive.newOwner, dataType: receive.dataType });

  // assuming newOwner is a participant
  let allAssets = await query(qry, { owner: receive.newOwner.getIdentifier(), dataType: receive.dataType });

  if (allAssets.length === 0) {
    // No assets exists, add one
    // use assetRegistry.add()
  } else {
    for (var i = 0; i < allAssets.length; i++) {
      // Iterate over assets belonging to an owner of a product type
      // Do whatever here
      // use assetRegistry.update()
    };
  };

};
异步函数someTransaction(接收){ let assetRegistry=等待getAssetRegistry('您的名称\空间'); 让ownerRegistry=Wait getParticipantRegistry(“您的名字和空间”); let语句='选择\u资产的名称\u空间,\u其中(所有者==\u$owner&&dataType==\u$dataType)'; 设qry=buildQuery(语句); //这个查询可以用不同的方式完成 //假设newOwner是一个字符串(参与者的id) 让allAssets=wait查询(qry,{owner:receive.newOwner,dataType:receive.dataType});
//假设newOwner是参与者 让allAssets=wait查询(qry,{owner:receive.newOwner.getIdentifier(),dataType:receive.dataType}); if(allAssets.length==0){ //不存在任何资产,请添加一个 //使用assetRegistry.add() }否则{ 对于(变量i=0;i
谢谢您的回复,我有一些问题。这个实现在NodeSDK端吗?我如何在logic.js上使用它?我在这方面真的是新手。感谢您展示nodejs sdk端和logic.js端的唯一区别是术语
businessNetworkConnection
。只需在所有API调用中添加/删除术语即可在NodeJ和logic.js之间转换代码,您可以自己尝试。如果您不明白,我将添加另一个片段。因此您将使用
constqry=buildQuery(语句)
logic.js中
好的,尝试使用它。我的代码是>让q1=等待buildQuery('SELECT org.stock.mynetwork.Commodity'+'其中(productName==\u$productName和owner=\u$owner);>让result2=等待查询(q1,{productName:receive.productName,所有者:receive.newOwner});但是当我调用它时,它给了我JSONSerializer的错误您的代码很好,您不需要在
buildQuery()
部分中使用
wait
。该错误可能来自其他地方,您如何获取
receive
的值?你能把上面的代码也发出来吗?看来我们也一直在hyperledger.chat:)上聊天。我不知道是你。因此,如果错误出现在
newOwner
上,我们必须检查其类型。您能否发布
Receive
交易的相关部分。
newOwner
string
还是参与者?这可能会导致序列化json错误NewOwner是participantok,只需更新代码即可解决此问题
async function someTransaction(receive) {
  let assetRegistry = await getAssetRegistry('YOUR_NAME_SPACE');
  let ownerRegistry = await getParticipantRegistry('YOUR_NAME_SPACE');

  let statement = 'SELECT NAME_SPACE_OF_ASSET WHERE (owner == _$owner && dataType == _$dataType)';
  let qry = buildQuery(statement);

  // This query can be done in different ways
  // assuming newOwner is a string (id of participant)
  let allAssets = await query(qry, { owner: receive.newOwner, dataType: receive.dataType });

  // assuming newOwner is a participant
  let allAssets = await query(qry, { owner: receive.newOwner.getIdentifier(), dataType: receive.dataType });

  if (allAssets.length === 0) {
    // No assets exists, add one
    // use assetRegistry.add()
  } else {
    for (var i = 0; i < allAssets.length; i++) {
      // Iterate over assets belonging to an owner of a product type
      // Do whatever here
      // use assetRegistry.update()
    };
  };

};