当所有者通过 Lambda 函数直接在 DynamoDB 中更新时,AWS Amplify Data Gen 2 返回过时数据

问题描述 投票:0回答:1

我使用 React Native 和 Amplify Data 创建了一个 AWS Amplify 应用程序。 我为团队和团队成员设置了架构。 目前使用的身份验证是 AWS Cognito 用户池,其授权已添加到 Amplify Data 中的架构定义中:

authorization((allow) => [
  allow.ownersDefinedIn("owners"),
]),

添加新团队成员时,将使用 lambda 函数将新团队成员添加到团队所有者中,并更新成员所有者数组。 这是直接在 DyanmoDB 表中完成的。

当我打电话返回团队成员时(见下文),返回过时的数据:

const { data: teamMembers } = await team.members();

我定义了以下模式:

const schema = a.schema({
  Team: a
    .model({
      code: a.string().required(),
      members: a.hasMany("Member", "teamId"),
      owners: a.string().array(),
    })
    .secondaryIndexes((index) => [index("code")])
    .authorization((allow) => [
      allow.ownersDefinedIn("owners"),
    ]), 

  Member: a
    .model({
      firstname: a.string().required(),
      surname: a.string().required(),
      fullName: a.string().required(),
      email: a.email().required(),
      teamId: a.id().required(),
      team: a.belongsTo("Team", "teamId"),
      owners: a.string().array(),
    })
    .authorization((allow) => [
      allow.ownersDefinedIn("owners"),
    ]),
});

我还定义了一个 lambda 函数来向现有团队添加成员。 它通过将新成员用户 ID 添加到所有者数组来实现此目的:

const updateInput: UpdateItemCommandInput = {
  TableName: tablename,
  Key: {
    id: team.id,
  },
  UpdateExpression: "set owners = :o",
  ConditionExpression: "id = :i",
  ExpressionAttributeValues: {
    ":o": {
      L: [
        ...(team["owners"]["L"] as []),
        {
          S: memberId,
        },
      ],
    },
    ":i": team.id,
  },
  ReturnValues: "ALL_NEW",
};
const updateCommand = new UpdateItemCommand(updateInput);
return await ddbClient.send(updateCommand);

团队的每个成员也重复此操作:

const updateInput: UpdateItemCommandInput = {
  TableName: tablename,
  Key: {
    id: entity.id,
  },
  UpdateExpression: "set owners = :o",
  ConditionExpression: "teamId = :t",
  ExpressionAttributeValues: {
    ":o": {
      L: [...owners],
    },
    ":t": team.id,
  },
  ReturnValues: "ALL_NEW",
};
const updateCommand = new UpdateItemCommand(updateInput);
await ddbClient.send(updateCommand);

当我打电话返回团队成员时(见下文),返回过时的数据:

const { data: teamMembers } = await team.members();

但是,当我调用观察查询时,会返回正确的数据:

client.models.Member.observeQuery({
  authMode: "userPool",
}).subscribe({
  next: ({ items, isSynced }) => {
    console.log("Member.observeQuery: ", items, isSynced);
  },
})

我已经搜索过这是否可能是缓存问题,但我没有找到与此相关的信息。

非常感谢任何帮助。

react-native aws-amplify aws-appsync
1个回答
0
投票

作为入职流程的一部分,对于我们正在开发的应用程序,我们尝试同时注册两个用户。 这是我们遇到问题的根本原因。 当我们更改流程以一次处理一个用户时,问题就解决了。 我希望它对其他人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.