【问题标题】:Unable to pass nodejs variable into JSON string无法将 nodejs 变量传递到 JSON 字符串
【发布时间】:2021-11-01 15:50:59
【问题描述】:

如何将sns_NameSpace 变量传递到payload?我收到错误Unrecognized token sns_NameSpace。我尝试使用 JSON 进行字符串化,但仍然出现相同的错误。

Error:

   "errorMessage": "Could not parse request body into json: Could not parse payload into json: Unrecognized token 'sns_NameSpace': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')\n at [Source: (byte[])\"{ \"Host\": sns_NameSpace, \"Key\": sns_key, \"Value\": \"1\"}\"; line: 1, column: 25]",

code:

   var sns_NameSpace = sns.Trigger.Namespace;
   var sns_NameSpace = JSON.stringify(sns_NameSpace.replace("/", "_"));
   var sns_key = JSON.stringify(sns_ApiId + '_' + sns_MetricName);

  var params = {
    FunctionName: 'zabbixPy', // the lambda function we are going to invoke
    InvocationType: 'RequestResponse',
    LogType: 'Tail',
    Payload: '{ "Host": sns_NameSpace, "Key": sns_key, "Value": "1"}'
  };

【问题讨论】:

    标签: javascript node.js json


    【解决方案1】:

    假设您有一个有效的字符串,您应该可以为此使用template literals。

    前:

    var params = {
        ...
        Payload: `{ "Host": ${sns_NameSpace}, "Key": ${sns_key}, "Value": "1"}`
    };
    

    另外,我建议使用不同的变量名而不是定义,然后重新定义sns_nameSpace。

    【讨论】:

    • 好的,测试一下。如第二行所示,SNS_Namespace 是否需要 JSON.Stringify?
    • 已经是字符串了吗
    • 我仍然收到无法识别的令牌错误。但是$ 似乎是个问题。无法将请求正文解析为 json:无法将有效负载解析为 json:无法识别的令牌“$”:期待(JSON 字符串、数字、数组、对象或令牌“null”、“true”或“false”)\n at [来源:(byte[])\"{ \"Host\": ${sns_hostname}, \"Key\": ${sns_key}, \"Value\": \"1\"}\";行:1,列:13]",
    • 啊,好吧,我会@Codebling的解决方案#1
    • 对于未来的读者,如果您看到类似Unrecognized token '$' 的错误,很可能您需要使用反引号(`)而不是单引号或双引号('、")绕着你的弦。另一种可能性是您使用的 Node.js 版本早于 4.0.0 或 2013-2014 年的浏览器
    【解决方案2】:

    这个问题应该重命名为“如何连接变量和字符串?”。问题出在您的“有效负载”行上。

    问题:变量被逐字解释

    这是无效的字符串:

    '{ "Host": sns_NameSpace, "Key": sns_key, "Value": "1"}'
    

    从错误消息中可以看出,sns_NameSpace 没有被替换,因此被逐字解释为无效的 JSON 令牌。

    方案一:字符串拼接

    可以使用string concatenation operator (+)连接字符串

    '{ "Host": ' + sns_NameSpace + ', "Key": ' + sns_key + ', "Value": "1"}'
    

    解决方案 2:模板字符串

    或者可以这样使用template strings:

    `{ "Host": ${sns_NameSpace}, "Key": ${sns_key}, "Value": "1"}`
    

    请注意,模板字符串使用 `(反引号),而不是 '(单引号)

    【讨论】:

    • 模板字符串不起作用。我犯了同样的错误。无法将请求正文解析为 json:无法将有效负载解析为 json:无法识别的令牌“$”:期待(JSON 字符串、数字、数组、对象或令牌“null”、“true”或“false”)\n at [来源:(byte[])\"{ \"Host\": ${sns_hostname}, \"Key\": ${sns_key}, \"Value\": \"1\"}\";行:1,列:13]",
    • 请注意这是一个反引号,而不是单引号
    【解决方案3】:

    在 JS 中构建对象并然后将其字符串化会更直接,而不是字符串化各个部分并在字符串中包含文字 JSON 片段:

    var sns_NameSpace = sns.Trigger.Namespace;
    var sns_NameSpace = JSON.stringify(sns_NameSpace.replace("/", "_"));
    var sns_key = JSON.stringify(sns_ApiId + '_' + sns_MetricName);
    var params = {
      FunctionName: 'zabbixPy', // the lambda function we are going to invoke
      InvocationType: 'RequestResponse',
      LogType: 'Tail',
      Payload: JSON.stringify({
        Host: sns_NameSpace.replace('/', '_'),
        Key: sns_ApiId + '_' + sns_MetricName,
        Value: 1
      })
    };
    

    【讨论】:

      猜你喜欢
      • 2016-12-03
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 2018-12-17
      • 2020-12-10
      • 2018-07-19
      相关资源
      最近更新 更多