【问题标题】:bash - invalid JSON when curling to Herokubash - 卷曲到 Heroku 时 JSON 无效
【发布时间】:2017-09-08 21:10:27
【问题描述】:

我正在编写我的第一个 bash 脚本,尝试通过 curl 设置 Heroku 环境变量。但是,我从 Heroku 收到一个错误的请求错误,说我的数据是无效的 JSON。不过我不明白为什么。

首先,我的 bash 脚本:

#!/bin/bash

GIT_COMMIT=`node get_git_commit.js`

echo $GIT_COMMIT

curl -n -X PATCH https://api.heroku.com/apps/my-app-name/config-vars \
  -d '{
  "GIT_COMMIT": $GIT_COMMIT
}' \
  -H "Content-Type: application/json" \
  -H "Accept: application/vnd.heroku+json; version=3"

这个脚本引用了 JavaScript 文件,get_git_commit.js:

const fs = require("fs")

require("child_process").exec("git rev-parse HEAD", (err, stdout) => {
    const commit = stdout.replace(/\n/g, "")
    console.log(`"${commit}"`)
}

当我运行 bash 脚本时,echo 正确地将 git 哈希打印到控制台,但 Heroku 返回

{
    "id":"bad_request",
    "message":"Provided data is invalid JSON."
}

我测试只是手动设置数据为

"GIT_COMMIT": 1234

而且效果很好。

我对 bash 编写完全陌生,所以我可能缺少一些基本约定 - 任何指导将不胜感激。

【问题讨论】:

    标签: javascript bash heroku


    【解决方案1】:

    $GIT_COMMIT 可能不是数字。

    您可能正在发送类似{ "GIT_COMMIT": 4d2fb } 的内容,这不是有效的 JSON。

    您需要将字符串用引号括起来。

    【讨论】:

    • 你绝对是对的(我忘了哈希不会是严格的数字),我确实尝试将 $GIT_COMMIT 括在引号中 - console.log("${stdout}")在 JS 文件中 - 但仍然产生相同的错误(echo 包含引号)。
    • 确切的请求正文是什么?
    【解决方案2】:

    正如 SLaks 所说,这是一个报价问题。尽管我正在准备带有双引号的 git commit 哈希字符串,但它需要在 bash 脚本中添加一个额外的单引号包装器 -

    "GIT_COMMIT": "'"$GIT_COMMIT"'"
    

    做到了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      • 2018-07-12
      • 1970-01-01
      • 2015-09-09
      • 2018-07-08
      • 2012-08-13
      相关资源
      最近更新 更多