首页 > 解决方案 > AWS DocumentClient 查询从未被调用

问题描述

我正在查询这样的全局二级索引:

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

AWS.config.update({ region: "us-east-1" });

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

exports.handler = (event, context, callback) => {
    console.log("EVENT\n" + JSON.stringify(event, null, 2));

    context.callbackWaitsForEmptyEventLoop = false;

    const requestBody = JSON.parse(event.body);

    const guestName = requestBody.guestName;

    var params = {
        TableName: "realize-guests",
        IndexName: "GuestName-index",
        KeyConditionExpression: "GuestName = :guestName",
        ExpressionAttributeValues: {
            ":guestName": guestName
        },
        ProjectionExpression:
            "GuestName, Info, LinkedInUrl, S3ImageUrl, Titles, Company"
    };

    console.log("DEBUG\n" + "Query request: [" + guestName + "]");

    docClient.query(params, function(err, data) {
        if (err) {
            console.log(
                "ERROR\nCould not retrieve data from realize-guests\nError is: [" + err + "]");

            callback(null, failure(err));
        } 
        else {
            console.log("DEBUG\n" + "Query complete: [" + data + "]");

            callback(null, success(data));
        }
    });
};

令人惊讶的是,似乎没有调用docClient.query或者它进入空间,因为日志显示如下:

16:30:25 START RequestId: bd2232f1-bf26-48f5-8e22-809eb41bd67a Version: $LATEST
16:30:25 2019-08-27T16:30:25.125Z bd2232f1-bf26-48f5-8e22-809eb41bd67a  DEBUG Query request: [Bob Smith]
16:30:25 END RequestId: bd2232f1-bf26-48f5-8e22-809eb41bd67a
16:30:25 REPORT RequestId: bd2232f1-bf26-48f5-8e22-809eb41bd67a Duration: 813.90 ms Billed Duration: 900 ms Memory Size: 128 MB Max Memory Used: 75 MB

日志从不显示指示docClient.query已执行/完成的 ERR 或 DEBUG 语句,我对原因感到困惑。

顺便说一句,我可以通过 AWS CLI 进行相同的查询并检索必要的数据。

想法?

标签: node.jsamazon-web-servicesaws-lambdaamazon-dynamodb

解决方案


我会使用 async/await 而不是回调。您所描述的内容听起来像是查询的异步性质的问题:

您的函数如下所示:

module.exports.handler = async (event, context) => {
  const params = {
    TableName: "realize-guests",
    IndexName: "GuestName-index",
    KeyConditionExpression: "GuestName = :guestName",
    ExpressionAttributeValues: {
        ":guestName": guestName
    },
    ProjectionExpression:
        "GuestName, Info, LinkedInUrl, S3ImageUrl, Titles, Company"
  };

  try {
    const data = await docClient.query(params).promise();
    return { statusCode: 200, body: JSON.stringify({ params, data }) };
  } catch (error) {
    return {
      statusCode: 400,
      error: `Could not query: ${error.stack}`
    };
  }
};

推荐阅读