Rails и Node в одном приложении на Heroku? - PullRequest
12 голосов
/ 10 июня 2011

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

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

Ответы [ 2 ]

8 голосов
/ 13 июня 2011

Я не думаю, что можно смешивать 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 app.В дополнение к загрузке файла, включите в эту форму через скрытые поля ввода любые другие переменные, которые необходимо передать в приложение Node.Когда загрузка в приложение Node завершена, он может перенаправить клиента обратно в приложение Rails, передавая любой статус или переменные в качестве параметров получения.

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

2 голосов
/ 16 марта 2012

Вам нужно два приложения. Я делаю именно то, что описано в этом вопросе. Я хотел больших потоковых загрузок, и, поскольку 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, разрешающий межсайтовый запрос.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...