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

将NATS流式输出经jq处理后传入cURL的实现问题

解决NATS订阅流式输出转cURL请求的Bash脚本问题

以下是能正确处理流式输出、解析JSON并发送cURL请求的实现方案:

# 订阅NATS主题,将输出处理为单行JSON后逐行解析发送请求
while IFS= read -r json_line; do
    # 从JSON中解析token和name字段
    token=$(echo "$json_line" | jq -r '.token')
    name=$(echo "$json_line" | jq -r '.name')

    # 跳过字段为空的无效条目
    if [[ -z "$token" || -z "$name" ]]; then
        continue
    fi

    # 发送cURL请求,替换为你的目标API地址
    curl -X POST \
        -H "Authorization: Bearer $token" \
        -H "Content-Type: application/json" \
        -d "{\"name\": \"$name\"}" \
        "https://your-target-api.com/endpoint"
done < <(nats sub demo.1 --queue demo -r | jq -c '.')

核心细节说明:

  • 规避子shell陷阱:用< <(command)进程替换写法替代管道| while read,后者会让while循环在子shell中运行,容易导致变量失效或循环逻辑不触发,这是你之前循环未执行的常见原因。
  • jq格式化单行JSON:添加-c参数让jq将每个JSON实体输出为单行,确保read命令能完整读取一个JSON对象,避免多行JSON拆分导致的解析错误。
  • 安全构造请求体:如果担心Bash转义问题,也可以用jq直接生成请求体,更稳妥:
    request_body=$(echo "$json_line" | jq -c '{name: .name}')
    curl -X POST \
        -H "Authorization: Bearer $token" \
        -H "Content-Type: application/json" \
        -d "$request_body" \
        "https://your-target-api.com/endpoint"
    

排查技巧:

  1. 先单独执行nats sub demo.1 --queue demo -r | jq -c '.',确认输出是否为有效单行JSON,排除NATS输出含非JSON日志的情况(若有,可加grep '^{'过滤)。
  2. 单独测试jq解析逻辑,比如echo '{"token":"test-token","name":"test-name"}' | jq -r '.token',验证字段提取是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 23:30:58