为什么Dynamodb.put在Lambda函数中不起作用?返回null。如何调试?

时间:2019-05-08 05:26:03

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

调试lambda令人沮丧。

我有一个非常简单的lambda函数:

const AWS = require('aws-sdk')

const dynamodb = new AWS.DynamoDB.DocumentClient({region: 'ap-southeast-2'});

exports.handler = async (event, context, callback) => {

    const params = {
        TableName: 'people-dev',
        Item: {
            id: '1',
            name: 'person',
            email: 'person@example.com'
        }
    };

    dynamodb.put(params, (err, data) => {
        if(err) {
            callback(err, null)
        } else{
            callback(null, data)
        }

    });

};

测试响应为:

Response:
null

Request ID:
"3d7e9329-3843-4760-917d-4b4d4781dbd7"

Function Logs:
START RequestId: 3d7e9329-3843-4760-917d-4b4d4781dbd7 Version: $LATEST
END RequestId: 3d7e9329-3843-4760-917d-4b4d4781dbd7
REPORT RequestId: 3d7e9329-3843-4760-917d-4b4d4781dbd7  Duration: 243.13 ms Billed Duration: 300 ms     Memory Size: 128 MB Max Memory Used: 29 MB  

没有任何内容写入Dynamo。 没有任何有用的信息记录在cloudwatch中。 是的,该功能具有DynamoDB的完全权限。

2 个答案:

答案 0 :(得分:1)

问题在于处理程序正在异步执行。

exports.handler = async (event, context, ....

将其更改为以下内容,可以解决此问题:

exports.handler = function (event, context, ....

答案 1 :(得分:1)

async放回原处,因为使用回调已过时,并且容易出错。使用node.js aws-sdk上可用的内置promise()方法,而对这些承诺仅使用await。如果要处理错误,只需在代码中加上try/catch块即可。

const AWS = require('aws-sdk')

const dynamodb = new AWS.DynamoDB.DocumentClient({region: 'ap-southeast-2'});

exports.handler = async (event) => {

    const params = {
        TableName: 'people-dev',
        Item: {
            id: '1',
            name: 'person',
            email: 'person@example.com'
        }
    };

    await dynamodb.put(params).promise()

    return {
        statusCode: 200,
        body: JSON.stringify({message: 'Success'})
    }

};

有关async/await的更多信息