Heroku上同一个应用程序中的Rails和Node?

时间:2011-06-10 06:52:49

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

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

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

2 个答案:

答案 0 :(得分:8)

我认为在同一个应用程序中混合使用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应用程序,将任何状态或变量作为get参数传递。

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

答案 1 :(得分: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。无法从Heroku外部访问共享数据库的DATABASE_URL(与RedisToGo等其他服务不同)。