Javascript 如果查询有多个输入,如何在Hyperledger composer logic.js中使用查询?
对于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
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()
};
};
};