Parse + Heroku. Фиксим


В конце октября heroku совместно с Parse анонсировали поддержку друг друга. Соответствующие функции добавлены в утилиту командной строки parse

То есть теперь есть возможность хостить Parse приложение прямо на heroku, и иметь полный доступ ко всем плюшкам NodeJS, таким как тот-же npm. Но не все так просто и судя по всему интеграция еще сыровата.
Пройдемся по шагам описаным в блоге и сразу при деплое найдем пару ошибок

beforeSave/afterSave для пользователей 

Оказывается, что регистрация хуков beforeSave/afterSave для пользователей не работает. То есть рекомендованный командой Parse способ не работает:

Parse.Cloud.beforeSave(Parse.User, function (request, response) { ... });

Не работает и замена Parse.User на "_User". Как оказалось ни один из триггеров для стандартных классов "_User" или "_Installation" не работают из вебхуков. Поэтому если там есть какая-то логика, придется отрефакторить код и перенести ее куда-то в другое место.

"Invalid webhook response status: 500 Internal Server Error"

Именно такую ошибку мы получим если попытаемся вызвать любой Parse.Query внутри Parse.Cloud функций.

var Parse = require('parse-cloud-express').Parse;

Parse.Cloud.define("test", function(request, response) {
  var Test = Parse.Object.extend("Test");
  var query = new Parse.Query(Test);
  query.count({
    success: function(count) {
      response.success("success: "+count);
    }, error: function(){
      response.error("can't fetch count");
    }
  });
});

Как оказалось в посдеплойном скрипте (scripts/register-webhooks.js) парс инициализировался стокой:

Parse.initialize(process.env.PARSE_APP_ID, "unused", process.env.PARSE_MASTER_KEY);


Притом вторым параметром - (unused) - должен быть JavaScript Key. Но если просто так его подставить в постдеплойменте, то это ничем не поможет.

Для того чтобы Парс запросы заработали нормально я добавил в Heroku Config Variables переменную PARSE_JS_KEY со значением JavaScript Key из админки Parse (Settings -> Keys).
После того в файле NodeJS сервера (server.js) нужно переинициализировать парс до того, как будут загружены cloud функции:

Parse.initialize(process.env.PARSE_APP_ID, process.env.PARSE_JS_KEY, process.env.PARSE_MASTER_KEY);

Все. Остальное вроде бы пока работает нормально.

Push нотификации

Поскольку мы сконфигурировали Parse как обычный JS клиент, то для того чтобы иметь возможность отсылать Push нотификации из heroku нужно включить клиетнские пуши в админке парса.

UPD: dirtyKeys в webhook'ах тоже не работают

В вебхуки не передаются dirtyKeys то есть если в вашем коде были проверки:
Parse.Cloud.beforeSave("Test", function (request, response) {

    if (request.object.dirty("test")){ ... }


То работать они перестанут. что опять-же приведет за собой рефакторинг.

Комментарии

Популярные сообщения из этого блога

Алгоритм NEAT. Эволюционирующие нейронные сети возрастающих топологий.

Цепи Маркова простыми словами. Пишем пирожки.