问题描述
因此,为了使用我在graphql模式中使用@key指令创建的GSI(全局二级索引)中的数据查询,我使用了放大CLI来添加了一个lambda函数类别。每当我尝试使用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',host: 'dynamodb.us-east-1-fake.amazonaws.com',port: 443,time: 2020-08-12T10:18:08.321Z },time: 2020-08-12T10:18:08.321Z }
Result:
null
Finished execution.
然后,我进行了更多研究,并遇到了this有关不可访问的dynamodb主机的信息,该线索在我运行模拟放大时一直遵循,并尝试实现,但无济于事。在这方面的任何帮助将不胜感激。
PS:值得一提的是,我能够通过Appsync控制台成功查询此数据,这使我坚信问题出在函数本身。
解决方法
经过更多研究并四处询问,我终于理解了在github上提供给我的答案
在可以访问dynamodb的函数上运行模拟时 API生成的表格。它将使用假值填充环境。如果 您想针对您的部署模拟lambda函数 dynamodb表,您可以在sdk客户端中编辑值,以便 准确拨打电话。
总而言之,如果您在本地运行事物,那么您将无权访问您可以尝试模拟的后端变量。我希望这可以帮助别人。谢谢!