【问题标题】:Chain requests in AWS API GatewayAWS API Gateway 中的链式请求
【发布时间】:2020-02-11 19:05:32
【问题描述】:

我目前正在使用后端的 AWS DynamoDB 创建网站。我从前端调用运行 Lambda 函数的 AWS API Gateway,然后从 DynamoDB 中获取数据。

现在我已经定义了一个具有多个属性的“Item”对象,包括一个“Tags”属性。一个项目可以有多个标签。两者都存储在单独的 DynamoDB 表中,并且 Item 有一个带有 TagID 数组的“Tags”列。每个 TagID 都链接到 Tags 表中的一个 Tag。

问题是,我如何最好地获取一个项目及其对应的标签对象?

当我从前端运行它时,我调用 /items API 来获取我想要的项目。在标签下,我得到了一组 TagID。我希望将这些标签作为实际对象,所以我是否应该简单地调用第二个 API 调用并将 TagID 数组替换为对象?我正在尝试找出在这种情况下的最佳做法。

在我写这篇文章时,也许我应该编辑获取项目的 Lambda 函数,以便它包含 Tag 对象?

这不是我正在做的完全准确的表示,但它应该给你正确的想法。

function Item() {
  const [items, setItems] = useState([]);

  useEffect(() => {
    async function onLoad() {
      if (!props.isAuthenticated) {
        return;
      }
      try{
        const items = await loadItems();
        setItems(items);
        /* Should I run my secondary call here? */
      } catch(e) {
        alert(e);
      }
      setLoading(false);
    }
    onLoad();
  }, [props.isAuthenticated]);

  function loadItems() {
    return API.get('nh', '/items');
  }
}

Item.propTypes = {
    itemId: PropTypes.string.isRequired,
    name: PropTypes.string.isRequired,
    description: PropTypes.string.isRequired,
    category: PropTypes.string.isRequired,
    tags: PropTypes.arrayOf(PropTypes.object)
}

【问题讨论】:

  • 那么,当你运行第二个函数时会发生什么?在那个地方你发表了评论
  • @Amir-Mousavi 我还没有实现这个,我真的在寻找最好的方法是什么。现在我在想,评论当前在哪里,创建一个空数组,然后对 /tags 进行 API 调用并按 ID 过滤标签,将它们推送到数组中,然后用新数组替换 Item 上的 TagID包含 Tag 对象。
  • 所以,考虑到你只有isAuthenticated 作为钩子依赖,这只能作为componentDidMount 工作,你当时需要那些对象(项目和修改的标签)。所以你现在想做什么听起来。除非出现另一个我们现在无法预见的问题。
  • 顺便说一句,我建议从依赖项中清除 isAuthenticated,并将其作为您的路由器责任来重定向未经授权的呼叫。

标签: reactjs amazon-web-services amazon-dynamodb aws-api-gateway


【解决方案1】:

我决定在 API 级别执行此操作,因为我相信这更像是一种业务逻辑方法。我正在获取的项目应该以标签对象数组的形式返回。

我需要清理一下,但这就是我所做的。

export async function main(event, context) {
    const itemParams = {
        TableName: process.env.itemsTable
    };
    const tagParams = {
        TableName: process.env.tagsTable
    };

    try {
        const itemResult = await dynamoDbLib.call('scan', itemParams);
        const tagResult = await dynamoDbLib.call('scan', tagParams);

        itemResult.Items.forEach(item => {

            /* Get tag objects per item */
            let tagObjects = [];
            item.tags.forEach(tag => {
                tagObjects.push(tagResult.Items.filter(obj => {
                    return obj.tagId === tag;
                })[0]);
            });
            item.tags = tagObjects;
        });

        return success(itemResult.Items);
    } catch(e) {
        return failure({ status: false });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2019-09-12
    • 2021-03-30
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多