Цепные запросы в AWS API Gateway - PullRequest
       19

Цепные запросы в AWS API Gateway

0 голосов
/ 10 февраля 2020

Я сейчас нахожусь в процессе создания сайта с AWS DynamoDB на сервере. Из внешнего интерфейса я вызываю AWS API-шлюз, который выполняет функцию Lambda, а затем извлекает данные из DynamoDB.

Теперь я определил объект «Item» с несколькими атрибутами, включая «Теги». атрибут. Один элемент может иметь несколько тегов. Оба хранятся в отдельных таблицах DynamoDB, а Item имеет столбец «Tags» с массивом TagID. Каждый TagID связан с тегом в таблице тегов.

Вопрос в том, как лучше всего получить элемент и соответствующие ему объекты тега?

Когда я запускаю это из внешнего интерфейса, я вызываю в API / items, который выбирает нужный элемент. Под Тегами я получаю массив 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)
}

1 Ответ

0 голосов
/ 11 февраля 2020

Я решил сделать это на уровне API, так как считаю, что это скорее подход бизнес-логики c. Элемент, который я получаю, должен возвращать теги как массив объектов тегов.

Мне нужно немного его почистить, но я так и сделал.

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 });
    }
}
...