下一个 js 应用程序中 formData 的“操作”多部分字段中的 JSON 无效?

Invalid JSON in the ‘operations’ multipart field in formData in next js application?

我有一个像这样的突变-

mutation signUp($avatar: Upload!) {
  signUp(
    avatar: $avatar
    input: { 
      name: "Siam Ahnaf"
      email: "siamahnaf198@aol.com"
      password: "12345678" }
  ) {
    message
    token
  }
}

为此,我已经从下一个 js 应用程序发送了这样的请求-

var formData = new FormData();
    formData.append('operations', '{ "query": "mutation($file: Upload!) {signUp(avatar: $file, input: {name: "Siam Ahnaf", email: "siamahnaf198@yahoo.com", password: "siam1980"}){message, token}}", "variables": { "file": null } }');
    formData.append('map', '{ "0": ["variables.file"] }');
    formData.append('0', Image);
    await axios({
        url: "http://localhost:3001/graphql",
        method: "post",
        data: formData,
        Headers: {
            'Accept': 'application/json'
        }
    })
        .then(response => console.log(response))
        .catch(error => console.log(error));

现在我收到这样的错误 - 在“操作”多部分字段中无效 JSON

但是我不明白我在'operation'json哪里错了。请帮助我。

提前致谢。

我正在从 the almost-duplicate question 复制我的答案,以防有人关闭:

如果引号内有引号并且想要 运行 JSON.parse ,则必须转义它们(正如其他人所提到的)。但是,在您的后续副本中,您不能只转义引号。你必须对它们进行两次或三次转义。

解释如下:

'{ "query": "mutation($file: Upload!) {signUp(avatar: $file, input: {name: \"Siam Ahnaf\", email: \"siamahnaf198@yahoo.com\", password: \"siam1980\"}){message, token}}", "variables": { "file": null } }'

当它被 JavaScript 解析时(因为它在单引号内),它接受 \" 并意识到你试图转义它们(不必要,因为它不是单引号quote),因此它将其转换为 "。现在解析器看到引号内的值(转义):

{ "query": "mutation($file: Upload!) {signUp(avatar: $file, input: {name: "Siam Ahnaf", email: "siamahnaf198@yahoo.com", password: "siam1980"}){message, token}}", "variables": { "file": null } }

如您所见,语法高亮显示在中途改变了颜色,因为引号已经被转义了。

要获得所需的输出,您必须使第一个字符串处理以反斜杠结束,因此您也必须转义 THE BACKSLASHES:

'{ "query": "mutation($file: Upload!) {signUp(avatar: $file, input: {name: \"Siam Ahnaf\", email: \"siamahnaf198@yahoo.com\", password: \"siam198\"}){message, token}}", "variables": { "file": null } }'

现在的问题是您需要两个反斜杠还是三个。这里的答案是,因为你的 OUTER 字符串使用单引号,你不需要也转义里面的双引号,所以你只需要为每个你想保留的双引号加上两个反斜杠。如果您在外部字符串中使用双引号,则必须进行三重转义而不是双引号,否则您的引号也不会被转义,并且原始字符串将无效。

经验法则:如果您要转义与您用于字符串的相同类型的引号,请进行三次转义。如果你想转义不同的类型,双重转义。