在AWS Amplify GraphQL中,嵌套深度是指查询中嵌套对象的层数。为了提高性能,避免不必要的数据加载,以及减少查询的复杂性,建议限制嵌套深度。
以下是一个示例解决方法,用于限制嵌套深度:
directive @nestingDepth(maxDepth: Int) on FIELD_DEFINITION
type Query {
user(id: ID!): User @nestingDepth(maxDepth: 2)
...
}
在项目根目录创建 amplify/backend/api/{API_NAME}/stacks/CustomResources 目录,并在该目录下创建 nestingDepth.js 文件。
const fs = require('fs-extra');
const path = require('path');
const amplifyMetaFilePath = path.join(__dirname, '../../../amplify-meta.json');
const amplifyMeta = JSON.parse(fs.readFileSync(amplifyMetaFilePath, 'utf8'));
const resolverFilePath = path.join(__dirname, '../../../amplify/backend/api/{API_NAME}/build/resolvers');
const resolverFiles = fs.readdirSync(resolverFilePath);
resolverFiles.forEach(file => {
const filePath = path.join(resolverFilePath, file);
const resolver = JSON.parse(fs.readFileSync(filePath, 'utf8'));
if (resolver && resolver.kind === 'UNIT' && resolver.providerName === 'AMAZON_DYNAMODB') {
const typeName = resolver.metadata.typeName;
const fieldName = resolver.metadata.fieldName;
const maxDepth = getNestingDepth(typeName, fieldName);
if (maxDepth) {
const resolverContent = fs.readFileSync(filePath, 'utf8');
const updatedResolverContent = addNestingDepthDirective(resolverContent, maxDepth);
fs.writeFileSync(filePath, updatedResolverContent);
}
}
});
function getNestingDepth(typeName, fieldName) {
const apiId = amplifyMeta.providers.awscloudformation.AmplifyAppId;
const graphqlApiId = amplifyMeta.providers.awscloudformation.Region;
const resourcePath = `amplify/backend/api/${apiId}/build/resolvers/${graphqlApiId}/${typeName}_${fieldName}.resolver.json`;
if (fs.existsSync(resourcePath)) {
const resourceContent = fs.readFileSync(resourcePath, 'utf8');
const resource = JSON.parse(resourceContent);
if (resource && resource.kind === 'UNIT' && resource.providerName === 'AMAZON_DYNAMODB' && resource.nestingDepth) {
return resource.nestingDepth;
}
}
return null;
}
function addNestingDepthDirective(resolverContent, maxDepth) {
const resolver = JSON.parse(resolverContent);
const pipelineFunctions = resolver.pipelineFunctions || [];
const directive = {
kind: 'DYNAMODB_NESTING_DEPTH',
nestingDepth: maxDepth
};
const updatedPipelineFunctions = [directive, ...pipelineFunctions];
resolver.pipelineFunctions = updatedPipelineFunctions;
return JSON.stringify(resolver, null, 2);
}
amplify push
在 amplify/backend/api/{API_NAME}/resolvers 目录下的相关解析器文件中,添加以下代码片段:
{
"kind": "DYNAMODB_NESTING_DEPTH",
"nestingDepth": 2
}
这样,最大的嵌套深度就被限制为2层。您可以根据需求调整最大深度。
请注意,这只是一个示例解决方法,您可能需要根据自己的项目结构和需求进行适当的调整。