【问题标题】:DynamoDB docClient scan does not respondDynamoDB docClient 扫描没有响应
【发布时间】:2020-10-13 19:20:43
【问题描述】:

我在使用无服务器的 Lambda 函数上使用 DynamoDB 和 nodeJS。 当我从本地计算机扫描项目时它可以工作,但是当我部署我的功能扫描时没有响应。没有错误

const docClient = new AWS.DynamoDB.DocumentClient({
  apiVersion: "2012-08-10",
});

const checkApiKey = async (apiKey, ) => {
  try {
    log.debug("before scan");
    let result = await docClient
      .scan({
        "MY_TABLE",
        FilterExpression: "#apiKey = :apiKey",
        ExpressionAttributeNames: {
          "#apiKey": "apiKey",
        },
        ExpressionAttributeValues: { ":apiKey": apiKey },
      })
      .promise();
     log.debug("after scan");
  } catch (error) {
    log.error("Can not get dynamo object", { message: error.message });
    throwError(error);
  }
};

当我在 AWS 上调用此函数时,我可以在日志中看到 before scan,但我没有看到 after scan 也没有看到来自 catch 的错误消息。

像“create”这样的 DynamoDB 操作可以正常工作。

我这几天一直在寻找解决方案...没有成功

【问题讨论】:

    标签: amazon-dynamodb serverless-framework aws-sdk-nodejs


    【解决方案1】:

    我不确定它是否会导致您的问题,但让我印象深刻的第一件事是您如何在扫描调用中定义表名:

     .scan({
            "MY_TABLE",
            ...
    

    根据文档,应该是键/值对

     .scan({
            TableName: "MY_TABLE",
            ...
    

    如果您使用的是无服务器框架,如果您运行本地与远程功能,您会得到不同的结果吗?

    例如,从命令行本地运行函数:

    sls invoke local --function <FUNCATION NAME from serverless.yml>
    

    vs 从命令行远程运行函数(在 AWS 中)

    sls invoke --function <FUNCATION NAME from serverless.yml>
    

    【讨论】:

    • 你是对的,它是我的代码的摘录,我有更改器 TableName 来发布我的问题。我正确使用了 TableName:"MY_TABLE"
    • 我尝试在本地调用我的函数,它工作正常;扫描返回结果。但是当我远程尝试时,扫描没有返回结果
    • 你是如何定义区域的?
    【解决方案2】:

    请尝试为await docClient.scan().promise()的promise添加回调

    我的意思是:

    let result = await docClient
        .scan({
            TableName: "MY_TABLE",
            FilterExpression: "#apiKey = :apiKey",
            ExpressionAttributeNames: {
                "#apiKey": "apiKey",
            },
            ExpressionAttributeValues: { ":apiKey": apiKey },
        })
        .promise()
        .then(data => console.log)
        .catch(error => console.error)
    

    然后检查结果,也许然后图片就变得清晰了。

    【讨论】:

    • 我已经使用 await 和 catch 来等待 promise 结果;我不能同时使用这两种方法:await 然后
    • 顺便说一句:扫描是一项相当昂贵的操作,您是否也可能不等到扫描完成? DynamoDB 表中有多少数据?
    • 只有 1 条记录 :) 这是该组件的第一个 AWS 部署!
    • 尝试定义 DynamoDB 所在的区域: const dynamoClient = new AWS.DynamoDB.DocumentClient({ region: 'eu-west-1', apiVersion: '2012-08-10' })
    • 我已经设置了区域。我还添加了 dynamodb 端点
    猜你喜欢
    • 2018-02-05
    • 2021-05-25
    • 2016-10-15
    • 1970-01-01
    • 2020-07-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多