【问题标题】:Rails and Node in the same app on Heroku?在 Heroku 上的同一个应用程序中的 Rails 和 Node?
【发布时间】:2017-02-21 17:54:46
【问题描述】:

我正在构建一个通过 CarrierWave 处理文件上传的 Rails 应用程序。目前,较大的文件上传会在很长一段时间内阻塞服务器。我见过像 s3-swf-upload-plugin gem 这样的解决方案,它跳过本地服务器并将文件直接从浏览器发送到 S3,但这需要进行一些修改以预先生成唯一的文件名并将它们与数据库同步。我相信这不会太麻烦,但是 Heroku 的新 Cedar 堆栈让我想到了将这些长时间运行的请求卸载到在同一应用程序中运行的 node.js 实例。我对这类事情不是很有经验,所以如果我的措辞有点不对劲,请原谅我。

这样的事情可能吗?您将如何配置某些请求(在本例中为涉及文件上传的请求)将由捆绑在与主 rails 应用程序相同的 heroku 存储库中的节点应用程序处理?

【问题讨论】:

  • 您是否考虑过为上传文件运行单独的 heroku 应用程序?
  • 即使它们在不同的实例上,我认为问题仍然适用于如何将它们集成在一起。另外,我不确定如何在两个单独的 heroku 应用程序之间共享数据库。
  • 您可以从 ENV['DATABASE_URL'] 获取数据库连接字符串,您应该可以在第二个应用程序上使用它。事实上,使用专用数据库,您甚至可以从 heroku 之外的应用程序访问它:devcenter.heroku.com/articles/external-database-access
  • 很高兴知道,但大部分问题是关于无缝集成两个独立应用程序的最佳方式。您是否只需将 rails 应用程序中的表单设置为发布到节点应用程序,让节点应用程序开始处理上传并同时重定向回 rails 应用程序?您将如何处理在两者之间传递操作状态?
  • 是的。我把它总结为一个完整的答案。

标签: ruby-on-rails node.js heroku


【解决方案1】:

我认为不可能在同一个应用程序中混合使用 Rails 和 Node。但是,您可以通过使用两个相互通信的独立应用获得大致相同的功能。

您可以使用 ENV['DATABASE_URL'] 来确定您的数据库连接字符串。使用 heroku 控制台将其设置为您的 Node 应用程序的 ENV 变量(例如heroku config:add OTHER_DB=your_connection_string)然后应该能够使用相同的连接字符串从您的其他 heroku 应用程序连接到相同的数据库。如果您有专用数据库,您甚至可以在 heroku 之外访问它,请参阅:http://devcenter.heroku.com/articles/external-database-access

为了两个应用程序之间的无缝集成,您可以让 Rails 应用程序呈现的表单发布到 Node 应用程序的 URL。除了文件上传之外,通过隐藏的输入字段在该表单中包含您需要与 Node 应用程序通信的任何其他变量。上传到 Node 应用程序完成后,它可以将客户端重定向回 Rails 应用程序,将任何状态或变量作为获取参数传递。

在同一域的两个子域下运行这两个应用程序,您甚至可以在它们之间共享 cookie。

【讨论】:

  • 谢谢,这很有帮助
  • 我不明白为什么 rails 应用程序会发布到 Node 应用程序的 URL。为什么不从节点调用 Rails URL 来获取 HTML?
  • @Luke:这个解决方案对你来说效果如何?它真的减少了文件上传的等待时间吗?
【解决方案2】:

您需要两个应用程序。我正在做这个问题中描述的事情。我想要大型流式上传,并且由于 Rack 在将下载内容传递给处理程序之前将下载内容写入临时文件,因此使用 Rails 无法做到这一点。

另一方面,Node.js 做得很好。所以有两个 Heroku 应用程序,Rails Web 应用程序和 Node.js (Express) Web 应用程序。 Rails Web 应用程序使用 SWFUpload 作为客户端解决方案。 Rails 应用程序和 Node.js 应用程序都有一个密钥作为 Heroku 配置变量。当用户需要上传时,客户端 Javascript 会从 Rails 服务器请求上传 URL。 Rails 服务器使用 Expires 参数形成一个上传 URL,并使用密钥计算签名。客户端 Javascript 处理程序将此 URL 传递给 SWFUpload(upload_url 属性)。用户选择要上传的文件,SWFUpload 开始将它们发布到upload_url。 Node.js 应用程序验证 URL 未过期并且签名有效。它使用强大的库处理表单数据。

另一个细节。 Flash 要求 Node.js 应用程序提供允许跨站点请求的 crossdomain.xml。

我的 Node.js 应用程序没有触及数据库;但如果是这样,我会按照之前的建议分享 DATABASE_URL 。请注意,除非您有专用数据库,否则您不能在 Heroku 之外共享 DATABASE_URL。共享数据库的 DATABASE_URL 无法从 Heroku 外部访问(与 RedisToGo 等其他一些服务不同)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2013-10-20
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    相关资源
    最近更新 更多