无法在本地的 lambda 中查询 dynamodb GSI

Unable to query dynamodb GSI in lambda locally

所以我使用 amplify CLI 添加了一个 lambda 函数类别,以便 查询 来自我使用 graphql 中的 @key 指令创建的 GSI(全局二级索引)的数据模式。每当我尝试使用 amplify mock function <functionName> 在本地模拟函数时,查询的回调函数都会返回 null。功能见下

const AWS = require("aws-sdk");
const db = new AWS.DynamoDB.DocumentClient({
  region: process.env.REGION,
  apiVersion: "2012-08-10",
});


 const params = {
  // ProjectionExpression: ["province", "gender", "updatedAt", "createdAt"],
  ExpressionAttributeValues: {
    ":provinceVal": "Sichuan",
  },
  IndexName: "RegistreesByProvince",
  KeyConditionExpression: "province = :provinceVal",
  TableName: process.env.API_PORTAL_SUBMISSIONSTABLE_NAME,
};

const calculateStatistics = async () => {
  try {
    const data = await db.query(params).promise();
    console.log(data);
  } catch (err) {
    console.log(err);
  }
};

const resolvers = {
  Query: {
    getStatistics: () => {
      return calculateStatistics();
    },
  },
};
exports.handler = async (event) => {
  // TODO implement
  const typeHandler = resolvers[event.typeName];
  if (typeHandler) {
    const resolver = typeHandler[event.fieldName];
    if (resolver) {
      var result = await resolver(event);
      return result;
    }
  }
}; // };

然后我尝试捕获整个事件并将其记录到控制台,如在 calculateStatistics 函数中所见,现在它向我显示了如下更明确的错误。

     { UnknownEndpoint: Inaccessible host: `dynamodb.us-east-1-fake.amazonaws.com'. This service may not be available in the `us-east-1-fake' region.
    at Request.ENOTFOUND_ERROR (/Users/apple/Documents/work/web/portal/amplify/backend/function/calcStatistics/src/node_modules/aws-sdk/lib/event_listeners.js:501:46)
    at Request.callListeners (/Users/apple/Documents/work/web/portal/amplify/backend/function/calcStatistics/src/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/Users/apple/Documents/work/web/portal/amplify/backend/function/calcStatistics/src/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/Users/apple/Documents/work/web/portal/amplify/backend/function/calcStatistics/src/node_modules/aws-sdk/lib/request.js:688:14)
    at ClientRequest.error (/Users/apple/Documents/work/web/portal/amplify/backend/function/calcStatistics/src/node_modules/aws-sdk/lib/event_listeners.js:339:22)
    at ClientRequest.<anonymous> (/Users/apple/Documents/work/web/portal/amplify/backend/function/calcStatistics/src/node_modules/aws-sdk/lib/http/node.js:96:19)
    at ClientRequest.emit (events.js:198:13)
    at ClientRequest.EventEmitter.emit (domain.js:448:20)
    at TLSSocket.socketErrorListener (_http_client.js:401:9)
    at TLSSocket.emit (events.js:198:13)
  message:
   'Inaccessible host: `dynamodb.us-east-1-fake.amazonaws.com\'. This service may not be available in the `us-east-1-fake\' region.',
  code: 'UnknownEndpoint',
  region: 'us-east-1-fake',
  hostname: 'dynamodb.us-east-1-fake.amazonaws.com',
  retryable: true,
  originalError:
   { Error: getaddrinfo ENOTFOUND dynamodb.us-east-1-fake.amazonaws.com dynamodb.us-east-1-fake.amazonaws.com:443
       at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)
     message:
      'getaddrinfo ENOTFOUND dynamodb.us-east-1-fake.amazonaws.com dynamodb.us-east-1-fake.amazonaws.com:443',
     errno: 'ENOTFOUND',
     code: 'NetworkingError',
     syscall: 'getaddrinfo',
     hostname: 'dynamodb.us-east-1-fake.amazonaws.com',
     host: 'dynamodb.us-east-1-fake.amazonaws.com',
     port: 443,
     region: 'us-east-1-fake',
     retryable: true,
     time: 2020-08-12T10:18:08.321Z },
  time: 2020-08-12T10:18:08.321Z }
Result:
null
Finished execution.

然后我做了更多的研究,发现了 线程关于 inaccessible-dynamodb-host-when-运行-amplify-mock 我遵循并尝试实施但无济于事。非常感谢对此的任何帮助。

PS:值得一提的是,我能够通过Appsync控制台成功查询到这些数据,这让我坚信问题出在函数本身。

经过更多研究和四处询问后,我终于理解了 github 上提供给我的答案

When running mock on a function which has access to a dynamodb table generated by API. It will populate the env with fake values. If you would like to mock your lambda function against your deployed dynamodb table you can edit the values in the sdk client so it can make the call accurately.

总而言之,如果您是 运行 本地事物,那么您将无法访问您可能会尝试模拟的后端变量。我希望这可以帮助别人。谢谢!