在NodeJS中存储很少修改的数据库值的最佳做法是什么?

时间:2018-04-17 12:05:51

标签: node.js mongodb session

我有一个与Salesforce一起使用的节点应用程序用于一些不同的事情。其中一项功能是让用户填写表单并将其推送到Salesforce。

表单有一个下拉列表,因此我查询salesforce以获取可用的下拉项列表,并通过res.locals将它们提供给我的表单。目前,我通过一些中间件获取这些值,将它们存储在用户会话中,然后检查是否设置了会话值,如果没有,则使用它们,查询salesforce并将其拉入。

这有效,但这意味着Mongo中的每个用户会话数据都包含一大堆选项列表(对所有用户来说都是一样的)。我很少对Salesforce方面的值进行更改,因此我想知道是否存在"正确的"在我的应用程序中存储这些val的方法?

我可以将它们拉入Mongo集合,并在它们发生变化时触发手动刷新。我可以在Mongo中使它们过期(但实际上如果它们确实需要更改,那是因为有人需要立即访问新值),所以不确定这是否最有意义......

将它们存储在每个人的会话中是解决此问题的最佳方法,还是我还应该做些什么呢?

1 个答案:

答案 0 :(得分:1)

要快速回答您的问题,您可以将它们添加到单个对象(而不是每个用户的会话数据)。但不确定如何管理他们的生命(即当他们改变时再次拉动它们)。单例可以使用一个简单的脚本文件来实现,该文件可以返回一个简单的对象...

但如果我要做这样的事情,我会采用不同的方式:

  1. 我会创建一个返回列表数据的API端点(可能会给它一个查询参数以返回不同的列表)。
  2. 如果您能够在短时间内承担过时的数据,那么您可以编写API以便它返回缓存的响应(http缓存,在短时间内)

    1. 如果您的数据必须是实时新鲜的,那么您的API应该在API的响应中返回一个eTag。 eTag标题基本上就像数据的校验和,良好的校验和将是集合中所有记录的“最后更新日期”。在收到请求后,您检查是否有包含校验和的标题“if-none-match”,此时,您对数据库执行“lite”调用以仅拉取校验和,如果匹配则返回304 http代码(未修改),否则您实际上会提取所需的完整数据并将其返回(与响应eTag中的新校验和一起)。基本上你是让你的浏览器进行缓存......
    2. 请注意,您还可以在第1点和第2点组合缓存并一起使用。

      此处有更多资源: https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers https://developers.facebook.com/docs/marketing-api/etags