2017-08-11 26 views
0

我想在chaincode中执行丰富的查询。每个同行都有CouchDB,我在marble source code中有跟随示例。 但我没有得到任何结果(没有错误),只是一个空的数组。丰富的查询没有结果 - Hyeperledger织物v1.0

enter image description here

当我运行在CouchDB中相同的查询,直接就没有问题,我得到一个或多个结果。

enter image description here

这是chaincode源代码我使用:

if len(args) == 3 && args[1] == "complex" { 
    fmt.Printf("Query complex\n") 

    if isJSON(args[2]) { 

     fmt.Printf("Complex query: %s\n", args[2]) 

     resultsIterator, err := stub.GetQueryResult(args[2]) 
     if err != nil { 
      jsonResp := "{\"Error\":\"Not able to make the query, see error: " + err.Error() + "\"}" 
      return shim.Error(jsonResp) 
     } 
     defer resultsIterator.Close() 

     // buffer is a JSON array containing QueryRecords 
     var buffer bytes.Buffer 
     buffer.WriteString("[") 

     bArrayMemberAlreadyWritten := false 
     for resultsIterator.HasNext() { 
      queryResponse, err := resultsIterator.Next() 
      if err != nil { 
       jsonResp := "{\"Error\":\"Not able to make the query, see error: " + err.Error() + "\"}" 
       return shim.Error(jsonResp) 
      } 
      // Add a comma before array members, suppress it for the first array member 
      if bArrayMemberAlreadyWritten == true { 
       buffer.WriteString(",") 
      } 
      buffer.WriteString("{\"Key\":") 
      buffer.WriteString("\"") 
      buffer.WriteString(queryResponse.Key) 
      buffer.WriteString("\"") 

      buffer.WriteString(", \"Record\":") 
      // Record is a JSON object, so we write as-is 
      buffer.WriteString(string(queryResponse.Value)) 
      buffer.WriteString("}") 
      bArrayMemberAlreadyWritten = true 
     } 
     buffer.WriteString("]") 

     fmt.Printf("Query Response: %s\n", buffer.String()) 

     return shim.Success(buffer.Bytes()) 
    } 

    jsonResp := "{\"Error\":\"The query is not a valid JSON\"}" 
    return shim.Error(jsonResp) 
} 
+0

文本的屏幕截图非常不友好,特别是对于搜索引擎和屏幕阅读器。请复制并粘贴文本。 – Flimzy

+0

@Flimzy屏幕截图不是来自Fabric的代码或错误或文本。所有这些都是我的chaincode(第一个)的自定义文本,第二个是Fauxton的查询结果。我没有看到为什么如果我从这里的屏幕截图复制/过去文本,搜索引擎会更有效率。 – AnTiToinE

+0

我不是在谈论Fauxton屏幕截图。我在谈论第一张照片。 – Flimzy

回答

3

的问题是具有与办 '的数据。' Fabric注入到保存到CouchDB状态数据库的文档中的元数据信封。从链代码作者的角度来看,没有'数据'信封,因此'数据'信封应该从传入的任何查询中排除。结构将在保存和查询时注入'数据'信封。如果您使用Fauxton UI直接对CouchDB进行试用查询(没有Fabric注入代码的好处),则需要包含“数据”信封。只要记住在编写链式代码查询时排除'数据'信封。

查看example queries对应于marbles02示例,请注意,没有提供数据信封。