使用Sequelize和Node延迟加载静态数据

时间:2015-01-11 22:38:36

标签: node.js caching asynchronous synchronous sequelize.js

我想缓存存储在一些没有太大变化的MySQL表中的数据。讨论的例子是country_codes,language_codes等,但我也有其他特定于应用程序的数据。这本身并不难。我认为,这让我很困难的是,我在Node,Sequelize和Express的世界中有两个似乎相互矛盾的约束:

  1. 我想通过“内联”函数访问数据,我将在JavaScript表达式和语句中广泛使用这些函数。例如,我希望能够使用Country.nameFromCode(code)之类的类方法连接字符串。据推测,这意味着这些方法是同步的。回调和承诺似乎是这种看似简单的请求/要求的真正解决方法。

  2. 我希望数据延迟加载。我可以在express-generator的典型bin / www脚本中轻松地在启动时加载数据。但在这里,似乎我的延迟加载数据的请求是合理的。据推测,.nameFromCode函数应该只在第一次访问时从数据库加载数据,然后缓存数据。

  3. 所以:我第一次收到.nameFromCode调用时,是否应该使用deasyncsyncsynchronize这样的模块?我一定要吗?似乎应该有一个更简单的答案。

    Sequelize或mysql驱动程序是否有同步的.query或.find方法?如果是这样,大概这是一种更好的方法?

    我应该放弃同步吗? :)我知道异步是节点等的咒语,但对于这样的情况来说,这似乎是一个沉重的代价。

    除了上面链接的模块之外,以下是一些看似相关的参考:

    感谢。

1 个答案:

答案 0 :(得分:0)

  

Sequelize或mysql驱动程序是否有同步的.query或.find方法?

不幸的是,我不知道。节点始终是异步I / O,但处理两者的fs模块除外。

  

第一次收到.nameFromCode调用时,我应该使用deasync,sync或synchronize等模块吗?我一定要吗?似乎应该有一个更简单的答案   [...]
  我应该放弃同步吗? [...]这样的情况似乎是一个沉重的代价。

您拥有的一个选项是使用async/await,即截至2016年1月,ECMAScript规范中的第3阶段提案。
基本上是:

  • 任何返回承诺的函数都可以await
  • 其他人await的任何功能都应标有async关键字
  • async函数将隐式返回Promise

您的代码仍然是异步的。但它几乎看起来像同步代码。真棒!

您可以实现以下内容:

async function claimThatYouAreInCountry ( code ) {
  var country = await Country.nameFromCode( code );
  console.log( "I'm in " + country.name );
}

Babel playground中的另一个例子(检查输出/控制台!)

我的建议是使用Babel's require hook,因此您的应用中的所有内容都会变得透明,并且您不需要构建步骤。