You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chainlink作业中如何正确访问mode任务返回的响应对象

问题根因

两种方案运行失败的核心原因如下:

  • 方案1(搭配jsonparse任务解析取值):jsonparse任务仅接受序列化后的JSON字符串作为入参,但mode任务执行完成后直接输出原生结构化对象(Go语言map[string]interface{}类型),不是字符串格式,因此触发data: expected string, got map[string]interface {}: bad input for task的类型不匹配错误。
  • 方案2(直接属性路径取值):路径写法错误,mode任务的返回结构没有顶层result字段,其顶层返回字段只有results(众数结果数组)和occurrences(众数出现次数),写my_median_task.result,0属于访问不存在的属性。
正确取值方式

不需要额外使用jsonparse任务解析mode任务输出,Chainlink节点的任务变量插值语法原生支持读取结构化输出的属性,数组元素通过.索引的格式访问即可。
要获取results数组的第一个元素,直接使用路径$(my_median_task.results.0)即可。

修改示例

移除冗余的parse_mode任务,修改encode_data的取值路径,同时调整任务流转链路,删除链路中多余的parse_mode节点:

schemaVersion = 1
name = "xxxxxxx"
contractAddress = "0x..."
maxTaskDuration = "0s"
observationSource = """
    decode_log   [type=ethabidecodelog
                  abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)"
                  data="$(jobRun.logData)"
                  topics="$(jobRun.logTopics)"]

    decode_cbor  [type=cborparse data="$(decode_log.data)"]
    fetch_1        [type=bridge name="bridgeTwo" requestData="{\"id\": $(jobSpec.externalJobID), \"data\": { \"txh\": $(decode_cbor.txh)}}"]
    parse_1        [type=jsonparse path="result" data="$(fetch_1)"]
    fetch_2        [type=bridge name="Test1" requestData="{\"id\": $(jobSpec.externalJobID), \"data\": { \"txh\": $(decode_cbor.txh)}}"]
    parse_2        [type=jsonparse path="result" data="$(fetch_2)"]
    fetch_3        [type=bridge name="Test2" requestData="{\"id\": $(jobSpec.externalJobID), \"data\": { \"txh\": $(decode_cbor.txh)}}"]
    parse_3        [type=jsonparse path="result" data="$(fetch_3)"]
    fetch_4        [type=bridge name="Test3" requestData="{\"id\": $(jobSpec.externalJobID), \"data\": { \"txh\": $(decode_cbor.txh)}}"]
    parse_4        [type=jsonparse path="result" data="$(fetch_4)"]
    fetch_5        [type=bridge name="Test4" requestData="{\"id\": $(jobSpec.externalJobID), \"data\": { \"txh\": $(decode_cbor.txh)}}"]
    parse_5        [type=jsonparse path="result" data="$(fetch_5)"]
    my_median_task [type="mode"
                values=<[ $(parse_1), $(parse_2), $(parse_3), $(parse_4), $(parse_5) ]>
                allowedFaults=2]
    encode_data  [type=ethabiencode 
                abi="(bytes value)" 
                data="{ \"value\": $(my_median_task.results.0) }"]
    encode_tx    [type=ethabiencode
                  abi="fulfillOracleRequest(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)"
                  data="{\"requestId\": $(decode_log.requestId), \"payment\": $(decode_log.payment), \"callbackAddress\": $(decode_log.callbackAddr), \"callbackFunctionId\": $(decode_log.callbackFunctionId), \"expiration\": $(decode_log.cancelExpiration), \"data\": $(encode_data)}"
                 ]
    submit_tx    [type=ethtx to="0x327A92FBb7D7c96D349B4207603B910d3c40c9F5" data="$(encode_tx)"]

    decode_log -> decode_cbor -> fetch_1 -> parse_1 -> fetch_2 -> parse_2 -> fetch_3 -> parse_3 -> fetch_4 -> parse_4 -> fetch_5 -> parse_5 -> my_median_task -> encode_data -> encode_tx -> submit_tx
"""
externalJobID = "ab58325c-1d12-4360-a15d-c656eca27dc0"

补充:如果一定要用jsonparse处理mode任务输出,必须先加jsonencode任务把mode输出的原生对象序列化为JSON字符串,再传给jsonparse,但这种方式多了两次不必要的序列化/反序列化操作,性能更差,不推荐使用。

内容的提问来源于stack exchange,提问作者Philipp Storz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:09:18