在 Heroku 上使用 Node 读取、写入和存储 JSON

Posted

技术标签:

【中文标题】在 Heroku 上使用 Node 读取、写入和存储 JSON【英文标题】:Reading, writing and storing JSON with Node on Heroku 【发布时间】:2014-09-05 00:17:40 【问题描述】:

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

该应用程序使用一个 JSON 文件,该文件目前正在与应用程序的其余部分一起推送,我们正在像这样读取和写入它:

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

...

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

目前这对原型有效,但我知道我们需要使用数据存储,否则当 Dyno 休眠或我推送更改时更改不会持续存在。

我读过用 Mongolabs 设置数据库可能是一个不错的选择,但我想知道是否还有其他选择,因为这似乎比必要的复杂。这对我来说是新的领域,所以如果 Mongo 是要走的路,指针也将不胜感激。

我们还想为一周中的每一天写入新文件作为备份。

干杯。

【问题讨论】:

将该文件放入.gitignore 怎么样? 取决于您的用例。详细点? 您的 Heroku 应用程序应该是无状态的。连接到数据库以持久保存单个文件可能看起来很愚蠢,但这就是您将数据与运行时分开的方式,这种设置有很多好处。当我需要 MongoDB 时,我个人使用 MongoHQ(他们也有 Heroku 插件)。您可能需要一点时间来设置它并弄清楚它,但为了这个确切的目的,您应该知道这一点。下次你需要 5 分钟。提示:尝试将您的本地/开发应用程序连接到一个 MongoHQ 实例,并将您的生产应用程序连接到另一个 MongoHQ 实例。 @danneu 我想我会尝试设置一个 MongoDB,学习肯定会很好。你有任何你知道的资源/教程来设置它吗,我对此的经验为零。 【参考方案1】:

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

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

mongo:功能丰富且速度相当快 s3:最适合映射到“文件系统”存储的抽象(注意权限) redis:简单快速

就个人而言,我更喜欢将 redis 用于简单的用例(听起来你的可能符合条件)。您可以直接转储 JSON 并将其解析出来。或者,最流行的 node 的 redis 客户端为简单的哈希提供了一个友好的接口:

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

Redis、mongo、s3:

https://elements.heroku.com/search?q=redis https://elements.heroku.com/search?q=mongo https://devcenter.heroku.com/articles/s3

【讨论】:

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

以上是关于在 Heroku 上使用 Node 读取、写入和存储 JSON的主要内容,如果未能解决你的问题,请参考以下文章

最大限度地减少 Salesforce Streaming API 和 Heroku Connect 之间的延迟

Heroku 不读取节点版本

你能从部署在 GitHub 上的 heroku 应用程序写入 JSON 文件吗

如何使用 Node.js 读取/写入图像?

Heroku 构建失败:“node_modules 已签入源代码管理”

无法在 heroku 上使用 node.js 连接到 mongolab