Rails和节点在Heroku上的同一个应用程序?

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

会有这样的事情吗? 你将如何configuration这样的事情,某些请求(涉及file upload,在这种情况下)将由与主轨应用程序捆绑在同一个heroku存储库中的节点应用程序处理?

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

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

为了在两个应用程序之间实现无缝集成,您可以将Rails应用程序呈现的表单发布到Node应用程序的URL中。 除了file upload之外,还可以通过隐藏的input字段在窗体中包含任何其他需要与Node应用程序通信的variables。 当上传到Node应用程序完成后,它可以将客户端redirect回Rails应用程序,传递任何状态或variables作为get参数。

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

你需要两个应用程序。 我正在做这个问题中所描述的。 我想要大量的数据stream上传,因为Rack在将文件传递给处理程序之前将下载文件写入临时文件,所以无法使用Rails进行此操作。

Node.js,另一方面,这很好地做到了这一点。 所以有两个Heroku应用程序,Rails Web应用程序和Node.js(Express)Web应用程序。 Rails web应用程序使用SWFUpload作为客户端解决scheme。 Rails应用程序和Node.js应用程序都有一个密钥作为Herokuconfigurationvariables。 当用户上传时,客户端Javascript请求来自Rails服务器的上传URL。 Rails服务器形成带有Expires参数的上传URL,并使用密钥计算签名。 客户端Javascript处理程序将此URL传递给SWFUpload(upload_url属性)。 用户select要上传的文件,SWFUpload开始将它们发布到upload_url。 Node.js应用程序validationURL是否过期,签名是否有效。 它使用强大的库来处理表单数据。

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

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