问题 在Heroku上使用Node读取,编写和存储JSON


我正在构建一个基于在Heroku上运行的Node.js的应用程序。

该应用程序使用一个JSON文件,目前正在与应用程序的其余部分一起推送,我们正在阅读和写入它,如下所示:

var channelsList = require("./JSON/channels.json");

...

fs.writeFile("JSON/channels.json", JSON.stringify(channelsList), onCleaned);

这对于原型来说现在已经有用了,但我知道我们需要使用数据存储,否则当Dyno睡眠或我推动更改时,更改将不会持久。

我已经读过,使用Mongolabs设置数据库可能是一个不错的选择,但我想知道是否还有其他选项,因为这似乎可能比必要的更复杂。这对我来说是一个新的领域,所以如果Mongo是要走的路,那么指针也会受到赞赏。

我们还希望将新文件写为一周中每天的备份。

干杯。


2393
2017-07-14 23:02


起源

放入该文件怎么样? .gitignore? - Amberlamps
取决于您的用例。阐述? - AJcodez
你的Heroku应用程序应该是无状态的。连接到数据库以保持单个文件的数量可能看起来很愚蠢,但这就是将数据与运行时分开的方式,这种设置有很多好处。当我需要MongoDB时,我个人使用MongoHQ(他们也有一个Heroku插件)。你可能需要花一点时间来设置它并弄清楚它,但是你应该知道这个目的。下次你需要5分钟。提示:尝试将本地/ dev应用程序连接到一个MongoHQ实例,将生产应用程序连接到另一个MongoHQ实例。 - danneu
@danneu我想我会尝试设置一个MongoDB,这肯定是好的学习。你有没有任何你知道的资源/教程来设置它,我没有这方面的经验。 - Jack Wild


答案:


披露:我是Heroku的node.js平台所有者。

您需要将状态从您的应用程序中删除。 要替换节点应用程序中的JSON文件,您应该查看mongo,s3和redis:

  • 蒙戈:功能丰富,速度相当快
  • S3:最好地映射到'文件系统'存储的抽象(注意权限)
  • Redis的:简单快捷

就个人而言,我更喜欢redis用于简单的用例(听起来你可能有资格)。您可以将JSON转储并解析出来。或者,最流行的节点redis客户端为简单的哈希提供友好的界面:

https://github.com/mranney/node_redis#friendlier-hash-commands

Redis,mongo,s3:


15
2017-07-15 23:17



感谢您的建议,我决定使用Mongo ......这对我们现在拥有的数据来说可能有些过分,但对于学习非常有用,如果我们将来可以扩展,那就太好了。 - Jack Wild
简而言之:你无法在heroku上创建文件,对吗?这让我对用户文件上传等问题提出了正确的看法。
@ prc322你可以在Heroku上创建文件。它们将作为临时文件系统的一部分存在于容器中 - 因此不适合长期存储(但是对于处理用户上载很好,但在节点中,将上传作为流处理通常更好)。 - hunterloftis
@hunterloftis我同意在用户上传时使用流api(s),但你的其余答案让我感到困惑:无论文件如何上传,它们最终都会成为你应用程序及其文件系统中的文件。其中一些将不得不在那里呆很长时间(即用户个人资料图片)。我在这里想念什么?
@ prc322这是一个很好的资源 12factor.net/processes,但这里是tldr:想象用户的个人资料图片上传到server1的文件系统上的server1。现在您获得了更多用户并需要扩展,因此您添加了server2。 server2的文件系统没有用户配置文件pic,因此当您的路由器将人员发送到server1时,他们可以看到该用户,但server2显示了损坏的图像。相反,水平可伸缩的应用程序应该使用状态的共享服务。对于文件/图像,最受欢迎的是Amazon S3(或 elements.heroku.com/addons/bucketeer 对于插件版本)。 - hunterloftis