尝试将数据插入dynamoDB时无服务器lambda函数抛出错误表

时间:2017-05-14 02:59:57

标签: javascript json amazon-web-services aws-lambda serverless-framework

我正在尝试使用无服务器框架在aws lambda函数上测试CRUD功能。

这是我正在运行的命令:

sudo serverless invoke local -f createArticle -p articles/event.json

当我尝试创建记录时,会抛出错误。这是控制台中的错误:

Syntax Error -------------------------------------------

 Unexpected token u in JSON at position 0

 For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.
Get Support --------------------------------------------
 Docs:          docs.serverless.com
 Bugs:          github.com/serverless/serverless/issues
 Forums:        forum.serverless.com
 Chat:          gitter.im/serverless/serverless

Your Environment Information -----------------------------
 OS:                 darwin
 Node Version:       6.10.3
 Serverless Version: 1.13.1

现在我已经使用了我的javascript并验证了我的event.json文件。

这是我的javascript:

'use strict';

const AWS = require('aws-sdk');
const dynamo = new AWS.DynamoDB.DocumentClient();
const uuid = require('uuid');

module.exports.handler = (event, context, callback) => {
  const data = JSON.parse(event.body);
  if (data.text && typeof data.text !== 'string') {
    console.log('Validation Failed');
    callback(new Error('Body did not contain a text property.'));
    return;
  }

  const params = {
    TableName: 'BlogTable',
    Item: {
      article_id: "1",
      text: data.text
    }
  };

  const putCallback = (error, result) => {
    if (error) {
      console.log(error);
      callback(new Error('Could not save record.'));
      return;
    }
    //console.log(result);
    const response = {
      statusCode: 200,
      body: JSON.stringify(result.Item)
    };
    callback(null, response);
  }
  dynamo.put(params, putCallback);
};

这是我的event.json文件:

{"text":"Hello World"}

为什么错误被抛出?我如何设置我在serverless.yml文件中尝试的环境变量,但我没有得到任何输出。

2 个答案:

答案 0 :(得分:1)

如果使用“Lambda代理”集成,则需要为直接调用Lambda函数的http://事件使用特定格式(例如,如果您使用CLI中的serverless invoke,而不是AWS API网关管理控制台,您可以使用“测试”按钮通过API调用Lambda函数。

使用Lambda代理,在此示例中,您需要创建一个带有“body”属性的json文件并对该值进行字符串化,如下所示:

{
  "body": "{\"text\":\"hello\"}"
}

原因是:“通过Lambda代理集成,API Gateway将整个客户端请求映射到后端Lambda函数的输入事件参数” http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-input-format

答案 1 :(得分:0)

在我的event.json文件中,我必须像这样放置我的json:

{"body": "{\"text\": \"Hello World\"}"