代码之家  ›  专栏  ›  技术社区  ›  moco

通过CLI向Firebase实时数据库发送有效JSON文件时出现错误400

  •  0
  • moco  · 技术社区  · 1 年前

    我试图将JSON文件上传到Firebase实时数据库,但总是收到错误400。我通过firebase网站手动上传了相同的JSON文件,上传成功。

    我检查了firebase-debug.log文件,注意到发送的JSON文件没有文件名,但我不确定为什么会这样。

    [debug] [2024-07-11T18:49:42.872Z] >>> [apiv2][query] PUT dbpath.firebaseio.com/users/uid/works/.json 
    [debug] [2024-07-11T18:49:42.873Z] >>> [apiv2][body] PUT dbpath.firebaseio.com/users/uid/works/.json [stream]
    [debug] [2024-07-11T18:49:43.291Z] <<< [apiv2][status] PUT dbpath.firebaseio.com/users/uid/works/.json 400
    [debug] [2024-07-11T18:49:43.292Z] <<< [apiv2][body] PUT dbpath.firebaseio.com/users/uid/works/.json {"error":"Invalid data; couldn't parse JSON object, array, or value."}
    [debug] HTTP Error: 400, Invalid data; couldn't parse JSON object, array, or value.
    [error] 
    [error] Error: Unexpected error while setting data: FirebaseError: HTTP Error: 400, Invalid data; couldn't parse JSON object, array, or value.
    

    这是我正在运行的bash代码(在验证文件有效并且var和uid文件具有相同数量的用户数据后运行此代码):

    for ((i=0; i<${#uids[@]}; i++)); do
        uid=${uids[$i]}
        var=${vars[$i]}
        
        
        varFile=$var
        varFile=${var//[-]/_}
        
        
        # Simular la llamada a ORCID y guardar el resultado en un archivo JSON
        echo "Realizando solicitud a ORCID para ${var}"
        echo $varFile
        jsonFilePath="/Users/user/Documents/folder/outputs_json/prueba/works${varFile}.json"
        curl -H 'Content-Type: application/orcid+json' -H 'Authorization: Bearer authkey' "https://pub.orcid.org/v3.0/${var}/works" -i -o "$jsonFilePath"
        jsonFile="works${varFile}.json"
        
        # Quitar las primeras 15 líneas del archivo JSON
        tail -n +17 "$jsonFile" > "${jsonFile}.tmp" && mv "${jsonFile}.tmp" "$jsonFile"
        
        # Actualizar Firebase con el UID
        echo "Actualizando Firebase para el UID ${uid}"
        echo $jsonFile
        firebase database:set "/users/${uid}/works/" --data ${jsonFile} -P project-name
        
    done
    

    我很困惑,因为我已经将--data值更改为完整的文件名和不同的变量,但我仍然会遇到同样的错误。我还通过打印验证了文件名和路径是否正确存储在变量中。任何帮助都将不胜感激!

    编辑:这是一个JSON文件示例:

    {
      "last-modified-date" : {
        "value" : 1685720662037
      },
      "group" : [ {
        "last-modified-date" : {
          "value" : 1685720662037
        },
        "external-ids" : {
          "external-id" : [ {
            "external-id-type" : "doi",
            "external-id-value" : "10.1111/tpj.15599",
            "external-id-normalized" : {
              "value" : "10.1111/tpj.15599",
              "transient" : true
            },
            "external-id-normalized-error" : null,
            "external-id-url" : {
              "value" : "https://doi.org/10.1111/tpj.15599"
            },
            "external-id-relationship" : "self"
          } ]
        },
        "work-summary" : [ {
          "put-code" : 136214894,
          "created-date" : {
            "value" : 1685720662037
          },
          "last-modified-date" : {
            "value" : 1685720662037
          },
          "source" : {
            "source-orcid" : null,
            "source-client-id" : {
              "uri" : "https://orcid.org/client/0000-0001-9884-1913",
              "path" : "0000-0001-9884-1913",
              "host" : "orcid.org"
            },
            "source-name" : {
              "value" : "Crossref"
            },
            "assertion-origin-orcid" : null,
            "assertion-origin-client-id" : null,
            "assertion-origin-name" : null
          },
          "title" : {
            "title" : {
              "value" : "The small RNA‐mediated gene silencing machinery is required in Arabidopsis for stimulation of growth, systemic disease resistance, and suppression of the nitrile‐specifier gene NSP4 by Trichoderma atroviride"
            },
            "subtitle" : null,
            "translated-title" : null
          },
          "external-ids" : {
            "external-id" : [ {
              "external-id-type" : "doi",
              "external-id-value" : "10.1111/tpj.15599",
              "external-id-normalized" : {
                "value" : "10.1111/tpj.15599",
                "transient" : true
              },
              "external-id-normalized-error" : null,
              "external-id-url" : {
                "value" : "https://doi.org/10.1111/tpj.15599"
              },
              "external-id-relationship" : "self"
            } ]
          },
          "url" : {
            "value" : "https://doi.org/10.1111/tpj.15599"
          },
          "type" : "journal-article",
          "publication-date" : {
            "year" : {
              "value" : "2022"
            },
            "month" : {
              "value" : "02"
            },
            "day" : null
          },
          "journal-title" : {
            "value" : "The Plant Journal"
          },
          "visibility" : "public",
          "path" : "/0000-0001-7872-3135/work/136214894",
          "display-index" : "0"
        } ]
      },
      ],
      "path" : "/0000-0001-7872-3135/works"
    }
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   Doug Stevenson    1 年前

    您使用的命令不正确:

    firebase database:set "/users/${uid}/works/" --data ${jsonFile} -P project-name
    

    这个 --data flag引入一个实际的JSON对象字符串作为下一个参数,而不是要导入的文件名。您可以通过以下方式了解CLI的预期 firebase database:set --help :

    Usage: firebase database:set [options] <path> [infile]
    
    store JSON data at the specified path via STDIN, arg, or file
    
    Options:
      -d, --data <data>      specify escaped JSON directly
      -f, --force            pass this option to bypass confirmation prompt
      --instance <instance>  use the database <instance>.firebaseio.com (if omitted, use default database
                             instance)
      --disable-triggers     suppress any Cloud functions triggered by this operation
      -h, --help             output usage information
    

    此帮助告诉您,您应该提供文件的名称作为其自己的参数,而不需要标记。所以你的命令应该更像这样:

    firebase -P project-name database:set "/users/${uid}/works/" "${jsonFile}"