【问题标题】:AWS Lambda function not writing to DynamoDBAWS Lambda 函数未写入 DynamoDB
【发布时间】:2019-11-16 16:33:33
【问题描述】:

我有一个假设要写入数据库的 lambda 函数。当我在本地机器上运行它时,它可以工作,但是当我将它上传到 lambda 并对其进行测试时,它并没有在数据库中放入任何东西。我使用该函数的角色可以完全访问 DynamoDB,并且当我从笔记本电脑运行它时,它的代码完全相同。知道为什么会这样吗?

这是我的 lambda。 dao 类包含实际访问 dynamo 的代码。我现在只是想上传一些常量字符串。

const DAO = require('./PostStatusDAO.js');

exports.handler = async (event, context, callback) => {
    var dao = new DAO();
    dao.post("this is a test", "@jordan", "@matt", "none");       
    const response = {
        statusCode: 200,
        body: {
            result: "good"
        }
    };
    return response;
};
const AWS = require('aws-sdk');

const ddb = new AWS.DynamoDB.DocumentClient({region: 'us-west-2'});

class PostStatusDAO {
    post(in_text, in_user, in_author, in_attachment) {
        var params = {
            Item: {
                user: String(in_user),
                timestamp: Date.now(),
                author: String(in_author),
                text: String(in_text),
                attachment: String(in_attachment),
            },

            TableName: 'Feed',
        };

        console.log(params);

        var result = ddb.put(params, (err, data) => {
            console.log("callback");
            if(err) {
                console.log("Error: ", err);
            } else {
                console.log("Data: ", data);
            }
        });

        // console.log(result);
    }
}

module.exports = PostStatusDAO;

【问题讨论】:

  • 您应该等待 ddb.put 操作完成,然后再从 lambda 返回响应。
  • CloudWatch Logs 中显示了什么?

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


【解决方案1】:

要查看函数失败的原因,您必须同步运行将承诺返回给调用者/运行时,如下所示:

const DAO = require('./PostStatusDAO.js');

exports.handler = async(event, context, callback) => {
    var dao = new DAO();

    // Return new promise 
    return new Promise(function(resolve, reject) {
     // Do async job
        dao.post("this is a test", "@jordan", "@matt", "none", function(err, data) {
            if (err) {
                console.log("Error: ", err);
                reject(err);
            }
            else {
                console.log("Data: ", data);
                resolve(data);
            }
        })
    })
};

const AWS = require('aws-sdk');

const ddb = new AWS.DynamoDB.DocumentClient({region: 'us-west-2'});

class PostStatusDAO {
    async post(in_text, in_user, in_author, in_attachment, callback) {
        var params = {
            Item: {
                user: String(in_user),
                timestamp: Date.now(),
                author: String(in_author),
                text: String(in_text),
                attachment: String(in_attachment),
            },

            TableName: 'Feed',
        };

        console.log(params);

        return ddb.put(params, callback).promise();
    }
}

module.exports = PostStatusDAO;

【讨论】:

  • 请问为什么我们需要同步运行,或者使用异步/等待模式?当调用 ddb.put(...) 方法时,底层基础设施应该只是继续写入结果,不是吗?不确定这是 javascript 的问题,还是 lambda 和/或 AWS 基础设施的特殊之处
  • 所有通过 SDK 发出的请求都是异步的,并且使用回调接口。这正是 AWS 设计的方式。 Lambda 支持异步和非异步处理程序,这取决于您,在此处查看更多信息:docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html
猜你喜欢
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2021-08-28
  • 2017-03-04
  • 1970-01-01
  • 2016-10-19
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多