【问题标题】:passing json to lambda function within将 json 传递给 lambda 函数
【发布时间】:2020-02-06 23:57:47
【问题描述】:

我正在编写一个无服务器应用程序,但在函数内部调用 lambda 函数时遇到了问题。两个功能分别按预期工作。当我尝试从函数 A 执行函数 B 时,它会给出以下错误。

JSON 中位置 0 处的意外标记 u

这是我的代码,我确定我的有效负载没有传递给第二个函数,我该如何解决? 函数A

module.exports.create = (event, context, callback) => {
  console.log('inside');
  const timestamp = new Date().getTime();
  console.log(JSON.parse(event.body));
  const data = JSON.parse(event.body);

  var jsonObj = {'user_avatar' : 'data.user_avatar',
                'name' : 'data.name'}
  const params2 = {
  FunctionName: "serverless-rest-api-with-dynamodb-dev-uploadImage",
  InvocationType: "RequestResponse",
  LogType: 'Tail',
  Payload: JSON.stringify(jsonObj)
  };

  lambda.invoke(params2, function (err, data) {
  if (err) {
    console.log('error : ' + err)
    callback(err, null)
  } else if (data) {
    const response = {
      statusCode: 200,
      body: JSON.parse(data.Payload)
    }
    callback(null, response)
  }
})

  const params = {
    TableName: process.env.BANK_TABLE,
    Item: {
      id: uuid.v1(),
      bankName: data.bankName,
      bankUrl: data.bankUrl,
      bankCardUrl: data.bankCardUrl,
      bankLogoID: data.bankLogoID,
      createdAt: timestamp,
      updatedAt: timestamp,
    },
  };

  // write the offers to the database
  dynamoDb.put(params, (error) => {
    // handle potential errors
    if (error) {
      console.error(error);
      callback(null, {
        statusCode: error.statusCode || 501,
        headers: { 'Content-Type': 'text/plain' },
        body: 'Couldn\'t create the offer item.',
      });
      return;
    }
    console.log('setting callback');
    // create a response
    const response = {
      statusCode: 200,
      body: JSON.stringify(params.Item),
    };
    callback(null, response);
  });
};

功能 B

module.exports.create = (event, context, callback) => {
  console.log('staring');
    console.log(JSON.parse(event.body));
     let encodedImage =JSON.parse(event.body).user_avatar;
     let decodedImage = Buffer.from(encodedImage, 'base64');
     var filePath = "avatars/" + JSON.parse(event.body).name + ".jpg"
     var params = {
       "Body": decodedImage,
       "Bucket": "imageuploads",
       "Key": filePath
    };
    s3.upload(params, function(err, data){
       if(err) {
           callback(err, null);
       } else {
           let response = {
        "statusCode": 200,
        "headers": {
            "my_header": "my_value"
        },
        "body": JSON.stringify(data),
        "isBase64Encoded": false
    };
           callback(null, response);
    }
    });

};

【问题讨论】:

  • 你检查你的日志。当您从A 调用lamda B 时是console.log('staring') 是日志
  • 请问该错误出现在哪一行?

标签: amazon-web-services aws-lambda serverless


【解决方案1】:

你得到的错误:

JSON 中位置 0 处的意外标记 u

通常是由于格式错误的 JSON。 遵循来自W3Schools 的 JSON 语法:

JSON 名称需要双引号。 JavaScript 名称没有。

所以你的 jsonObj 应该是:

var jsonObj = {"user_avatar" : data.user_avatar,
                "name" : data.name}

另外,请注意data.user_avatardata.name 是变量,它们不应该有引号。

【讨论】:

    【解决方案2】:

    问题在于您从 A 发送到 B 的有效负载。

    (注意JSON.parse(undefined) 几乎总是SyntaxError: Unexpected token u in JSON at position 0 背后的罪魁祸首)。

    函数 B,第 3 行表示:console.log(JSON.parse(event.body));

    但是,来自 A(A,第 12 行)的有效负载是:{'user_avatar' : 'data.user_avatar', 'name' : 'data.name'}

    这意味着event = JSON.stringify({'user_avatar' : 'data.user_avatar', 'name' : 'data.name'})event.body === undefined,这就是为什么当你尝试和JSON.parse(event.body) 你得到你的错误。

    要完成这项工作,您需要将第 7 行更改为:

    var jsonObj = { body: { user_avatar: 'data.user_avatar', name: 'data.name' } };
    

    我怀疑当您单独调用时它正在工作,因为您要么使用 API Gateway 调用(事件形状为 { body: ...data },要么您在控制台中的测试主体有类似的东西。)

    【讨论】:

      【解决方案3】:

      如果您在内部调用 lambda 函数(例如,用于单元测试),则应确保将其作为 json http 格式发送。

      create({body: JSON.stringify(myBodyObject)}, null, callBack)
      

      【讨论】:

        【解决方案4】:

        您必须更改请求正文。

        const data = JSON.parse(event.body);
        
        var jsonObj = {
          body: { //add body
            'user_avatar': data.user_avatar, //remove single quotes
            'name': data.name //remove single quotes
          }
        }
        const params2 = {
          FunctionName: "serverless-rest-api-with-dynamodb-dev-uploadImage",
          InvocationType: "RequestResponse",
          LogType: 'Tail',
          Payload: JSON.stringify(jsonObj)
        };
        
        lambda.invoke(params2, function(err, data) {
          if (err) {
            console.log("error : " + err);
            callback(err, null);
          } else if (data) {
            const response = {
              statusCode: 200,
              body: JSON.parse(data.Payload)
            };
            callback(null, response);
          }
        });
        

        【讨论】:

          猜你喜欢
          • 2022-01-13
          • 1970-01-01
          • 2017-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多