首页 > 解决方案 > 导出动态内容的 ES6 模块?

问题描述

这是一个关于如何处理 API 中不断变化的数据依赖关系的一般问题。

我在我的应用程序中依赖两个数据对象:

1. mycompanyProducts
2. mycompanySettings

产品对象如下所示:

{
  "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"
      }
    }
  }
}

设置对象仅包含应用程序设置,例如最大图像上传大小(以 MB 为单位)等。

这两个对象都来自 MongoDb 集合。

想法是这样的:我希望能够更新我的集合,并让我的 API 更新其依赖项,而无需重新构建。必须触发基于 Shopify webhook(其中一些更改的来源)等的 API 重建会非常麻烦。

每个产品都有一个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 模块是静态导出的,并且在重新构建应用程序之前不会改变。

我当然可以导出一个返回依赖项的函数,并在需要时调用这个函数来获取新的 deps,但问题是我的函数必须是async,所以很难调用:

import React from 'react'
const deps = generateDeps() // can't use await in this scope...

此外,放在const deps = generateDeps()我的文件顶部并不能真正解决问题,因为这将被评估一次,而且只有一次。

人们如何解决这个问题?

标签: javascriptasynchronousdependency-injectionecmascript-6promise

解决方案


导出一个函数并在您真正需要访问数据时调用它,而不是在模块的顶部。


推荐阅读