Подтвердить что ты не робот

Rails и Node в том же приложении на Heroku?

Я создаю приложение Rails, которое занимается загрузкой файлов через CarrierWave. В настоящее время более крупные загрузки файлов блокируют сервер на значительное количество времени. Я видел такие решения, как s3-swf-upload-plugin gem, которые пропускают локальный сервер и отправляют файлы прямо из браузера на S3, но для этого потребуются некоторые модификации для предварительного генерации уникальных имен файлов и их синхронизации с базой данных. Я уверен, что это не было бы слишком сложной задачей, но новый стек Кедра Heroku дал мне идею разгрузить эти длительные запросы к экземпляру node.js, запущенному в том же приложении. Я не очень разбираюсь в таких вещах, поэтому извините свою формулировку, если она немного ушла.

Возможно ли подобное? Как бы вы сконфигурировали такие вещи, чтобы определенные запросы (в том числе связанные с загрузкой файлов в этом случае) обрабатывались приложением node, входящим в тот же репозиторий heroku в качестве основного рельса?

4b9b3361

Ответ 1

Я не думаю, что можно смешивать Rails и Node в одном приложении. Однако вы можете получить примерно такую ​​же функциональность, используя два отдельных приложения, которые общаются друг с другом.

Вы можете использовать ENV ['DATABASE_URL'], чтобы определить строку подключения к базе данных. Используйте консоль heroku, чтобы установить ее как переменную ENV для вашего приложения Node (например, heroku config:add OTHER_DB=your_connection_string), должны иметь возможность использовать одну и ту же строку соединения для подключения к той же базе данных из другого приложения heroku. Вы можете даже получить доступ к нему за пределами heroku, если у вас есть выделенная база данных, см. http://devcenter.heroku.com/articles/external-database-access

Чтобы обеспечить бесшовную интеграцию между двумя приложениями, вы можете получить форму, отображаемую в сообщении Rails, URL-адресам приложения Node. В дополнение к загрузке файла, включите в эту форму через скрытые поля ввода любые другие переменные, необходимые для связи с приложением Node. Когда загрузка в приложение Node завершена, он может перенаправить клиента обратно в приложение Rails, передав любой статус или переменные в качестве параметров получения.

Запустите два приложения под двумя поддоменами того же домена, и вы даже можете делиться куки файлами между ними.

Ответ 2

Вам нужно два приложения. Я делаю то, что описано в этом вопросе. Мне нужны большие потоковые загрузки, и поскольку Rack записывает закачки в временный файл, прежде чем передавать их обработчику, это невозможно сделать с помощью Rails.

Node.js, с другой стороны, делает это красиво. Таким образом, есть два приложения Heroku, веб-приложение Rails и веб-приложение Node.js(Express). Веб-приложение Rails использует SWFUpload в качестве клиентского решения. Приложение Rails и приложение Node.js имеют секретный ключ в качестве переменной конфигурации Heroku. Когда пользователь загружает время, клиентский Javascript запрашивает URL-адрес загрузки с сервера Rails. Сервер Rails формирует URL-адрес загрузки с параметром Expires и вычисляет подпись с использованием секретного ключа. Обработчик Javascript на стороне клиента передает этот URL-адрес вместе с SWFUpload (свойство upload_url). Пользователь выбирает файлы для загрузки, и SWFUpload начинает отправку их в файл upload_url. Приложение Node.js проверяет, что URL-адрес не истек, и подпись действительна. Он обрабатывает данные формы с грозной библиотекой.

Еще одна деталь. Flash требует, чтобы приложение Node.js обслуживало файл crossdomain.xml, который разрешает запрос на межсайтовый сайт.

My Node.js приложение не касается базы данных; но если это так, я бы поделился DATABASE_URL, как было предложено ранее. Обратите внимание, что вы не можете использовать DATABASE_URL вне Heroku, если у вас нет выделенного DB. DATABASE_URL для общих баз данных недоступны из-за рубежа Heroku (в отличие от некоторых других сервисов, таких как RedisToGo).