将json传递给lambda函数

时间:2018-10-13 04:18:27

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

我正在编写一个无服务器应用程序,并且在调用函数内部的lambda函数时遇到麻烦。两个功能分别按预期工作。当我尝试从功能A执行功能B时,出现以下错误。

  

JSON在位置0处出现意外令牌

这是我的代码,我确定我的有效载荷没有传递给第二个函数,我该如何解决呢? 功能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);
    }
    });

};

4 个答案:

答案 0 :(得分:1)

您收到的错误:

JSON在位置0处出现意外令牌

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

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

所以您的jsonObj应该是:

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

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

答案 1 :(得分:0)

问题出在从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)时遇到错误。

要执行此操作,您需要将A行7更改为:

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

我怀疑当您分别调用API网关(事件形状为{ body: ...data }或控制台中的测试正文具有类似的功能)时,单独调用它是可行的。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您必须更改请求正文。

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);
  }
});