Это общий вопрос о том, как бороться со сдвигом зависимостей данных в API.
Я использую два объекта данных в моем приложении:
1. mycompanyProducts
2. mycompanySettings
Объект products выглядит так:
{
"MYTHING01": {
"sku": "MYTHING01",
"name": "15-Pack",
"price": 30,
"shopifyData": {
"id": "7987037995068",
"product_id": "664292996940",
"price": "30.00",
"taxable": true,
"inventory_quantity": 10,
"weight": 2,
"weight_unit": "kg",
"lastFetched": {
"$date": "2018-05-09T14:16:57.209Z"
}
}
},
"MYTHING02": {
"sku": "MYTHING02",
"name": "5-Pack",
"price": 15,
"shopifyData": {
"id": "7836960168028",
"product_id": "645959671756",
"price": "15.00",
"taxable": true,
"inventory_quantity": 10,
"weight": 2,
"weight_unit": "kg",
"lastFetched": {
"$date": "2018-05-09T14:16:57.228Z"
}
}
}
}
А объект настроек просто содержит настройки приложения, такие как максимальный размер загружаемого изображения в МБ и т. Д.
Оба эти объекта происходят из коллекций MongoDb.
Вот идея: я хочу иметь возможность обновлять свои коллекции, и чтобы мой API обновлял свои зависимости без необходимости перестраивать. Было бы очень обременительно запускать перестройки API на основе веб-заездов Shopify (откуда происходят некоторые изменения) и т. Д.
Каждый продукт имеет отметку времени shopifyData.lastFetched
, и если при доступе к данным, если отметка времени превышала некоторый период (10 минут) в прошлом, я хочу обновить данные, прежде чем продолжить:
// Loop through each Shopify product and update the product in the db
await Promise.all(res.data.products.map(async (shopifyProduct) => {
const variant = shopifyProduct.variants.find(v => mySKUs.includes(v.sku))
product.shopifyData = {
...variant,
lastFetched: new Date(),
}
await product.save()
}))
Вопрос: как я могу структурировать свой API для использования зависимостей обновления? Очевидно, что модули ES6 экспортируются статически и не изменятся, пока приложение не будет перестроено.
Я, конечно, могу экспортировать функцию , которая возвращает зависимости, и вызывать эту функцию, когда она мне нужна для свежих операций, но проблема в том, что моя функция обязательно async
, поэтому трудно по телефону:
import React from 'react'
const deps = generateDeps() // can't use await in this scope...
Более того, размещение const deps = generateDeps()
в верхней части моих файлов на самом деле не решает проблему, так как это будет оценено один раз и только один раз.
Как люди решают эту проблему?