将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"
排查技巧:
- 先单独执行
nats sub demo.1 --queue demo -r | jq -c '.',确认输出是否为有效单行JSON,排除NATS输出含非JSON日志的情况(若有,可加grep '^{'过滤)。 - 单独测试
jq解析逻辑,比如echo '{"token":"test-token","name":"test-name"}' | jq -r '.token',验证字段提取是否正常。
内容的提问来源于stack exchange,提问作者user1513388
相关产品推荐
相关产品推荐

