2011-06-10 134 views
12

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

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

+0

您是否考虑过为独立的heroku应用程序上传? – Elad 2011-06-11 07:00:21

+0

即使他们在不同的实例上,我认为这个问题仍然适用于如何将它们集成在一起。另外,我不确定两个独立的heroku应用程序之间如何共享数据库。 – Luke 2011-06-12 18:28:20

+0

您可以从ENV ['DATABASE_URL']获取数据库连接字符串,并且您应该可以在第二个应用程序中使用它。实际上,使用专用数据库,您甚至可以从heroku以外的应用程序访问它:http://devcenter.heroku.com/articles/external-database-access – Elad 2011-06-12 18:44:12

回答

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。

+0

谢谢,这是非常有帮助 – Luke 2011-06-14 15:46:08

+0

我不明白为什么rails应用程序发布到节点应用程序的URL。为什么不从节点调用Rails URL来获取HTML? – Tony 2012-02-21 13:33:51

+0

我想你也可以这样做...... – Elad 2012-02-22 12:58:00

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等其他服务不同)。

相关问题