Как выполнить миграцию с Parse (часть 3, миграция кода)

Ты слышал? Parse закрывает свой размещенный сервис в следующем месяце! Если вы купались в теплых амниотических жидкостях прокрастинации с января, то близится время вашего рождения в мире самостоятельного бэкенда.

К счастью, Go Nimbly здесь, чтобы помочь. Мы обработали множество миграций и собрали самое необходимое в этой серии из трех частей. Если вы этого не сделали, вы должны взглянуть на Часть 1 и Часть 2, прежде чем начать здесь.

В части 1 вы перенесли свои данные из размещенной службы Parse. Во второй части я рассмотрел развертывание приложения Heroku на сервере Parse.

Начиная

Сегодня на повестке дня два основных вопроса. Во-первых, направьте ваш интерфейс на ваш новый сервер Parse. Это зависит от используемого вами Parse SDK, но, к счастью, все они довольно похожи.

Второй компонент — перенос вашего облачного кода. Это будет немного варьироваться в зависимости от ваших конкретных потребностей, но я расскажу все, что вам нужно знать.

Чтобы завершить последнюю часть нашего руководства, состоящего из трех частей, потребуется менее двух часов, но, скорее всего, миграция потребует дополнительной работы.

Обновите инициализацию SDK

Существует множество различных Parse SDK. В этом руководстве я покажу вам, как обновить JavaScript SDK и iOS SDK.

Не используете JavaScript или iOS? Не беспокойся! В Parse весь код инициализации задокументирован для вашего удовольствия.

JavaScript

Если вы используете NPM, убедитесь, что вы устанавливаете последнюю версию JavaScript SDK. Запустите npm install и проверьте журналы для parse, чтобы убедиться, что вы используете последнюю версию. На данный момент последней версией является 1.9.2.

Если вы предпочитаете загружать предварительно скомпилированную версию, вы можете получить ее из CDN NPM:

https://npmcdn.com/parse/dist/parse.min.js

Найдите свою инициализацию Parse. Это должно выглядеть примерно так:

Parse.initialize("Your App ID", "Your Javascript Key");

Обновите код инициализации Parse, чтобы вместо этого он выглядел так:

Parse.initialize("Your App ID");
Parse.serverURL = "https://<your-heroku-app>.herokuapp.com/parse";

iOS

Сначала вам нужно запустить pod update. Это обновит ваш Parse SDK до последней версии.

Далее вам нужно обновить вашу инициализацию. Обычно код инициализации находится в вашем файле AppDelegate.m.

Для Swift обновленная инициализация будет выглядеть так:

let configuration = ParseClientConfiguration {
    $0.applicationId = "YOUR_APP_ID"
    $0.server = "http://<your-heroku-app>.herokuapp.com/parse"
}
// Swift 3.0
Parse.initialize(with: configuration)

А в Objective-C это будет выглядеть так:

[Parse initializeWithConfiguration:[ParseClientConfiguration configurationWithBlock:^(id<ParseMutableClientConfiguration> configuration) {
   configuration.applicationId = @"YOUR_APP_ID";
   configuration.server = @"http://<your-heroku-app>.herokuapp.com/parse";
}]];

Тестирование внешнего интерфейса

Дайте ему вихрь! Parse должен успешно инициализироваться, и вы сможете использовать PFQuery и PFObject. Вы можете выполнить простой тест, создав новый объект Parse (пример JavaScript):

var Foo = Parse.Object.extend("Foo");
var object = new Foo(); //create a new object
object.set("bar", 1); //set a value
object.save().then(function (savedObject) { //save the object
    console.log("object ID: " + savedObject.id);
}, function (error) {
    console.log(error);
}

Нет ошибок? Здорово!

Облачный код портов

Шаги, которые я задокументировал здесь, охватывают наиболее распространенные проблемы при переносе Cloud Code. Однако Cloud Code очень специфичен для каждого приложения Parse. Для получения дополнительной помощи ознакомьтесь с этой документацией по совместимости с Parse Server.

Переместите свой облачный код

Вообще говоря, код сервера и интерфейсный код лучше хранить в разных репозиториях. Это упрощает развертывание в Heroku и автоматизацию тестов. Облачный код большинства проектов, построенных на основе размещенной службы Parse, находится в том же каталоге, что и внешний код, из-за характера рабочего процесса Parse. Время исправить это.

Я предполагаю, что ваш облачный код находится в your/project/CloudCode/cloud. Это типично для приложения, работающего в размещенной службе Parse.

Самый простой способ переместить ваш облачный код — заменить каталог go-nimbly-parse-server-example/cloud каталогом /CloudCode/cloud/ в вашем текущем проекте с помощью перетаскивания. Однако это оставит историю Git для вашего облачного кода. Для любого производственного приложения это неприемлемо. Вместо этого следуйте этому краткому руководству для переноса каталога CloudCode/cloud/ с помощью серии команд Git.

Обновить требуемые() пути

Если вы попытаетесь развернуть свой облачный код сейчас, скорее всего, вы увидите такую ​​ошибку:

Error: Cannot find module 'aModule.js'

Это связано с тем, что способ работы require() в Parse Server немного отличается от работы с размещенной службой Parse. Вам необходимо обновить пути с require('cloud/path/to/file'); на require('./cloud/path/to/file');.

Включить недостающие библиотеки

Размещенный сервис Parse был достаточно хорош, чтобы включать в себя множество часто используемых библиотек, таких как Underscore.js и Moment.js. Ознакомьтесь с полным списком библиотек, чтобы точно узнать, какие из них вы используете.

Для каждой используемой вами библиотеки необходимо создать запись в зависимостях, перечисленных в package.json. Например, если вы хотите добавить Underscore.js в свой проект, вы должны добавить следующую строку в объект dependencies:

"underscore": "~1.8.0"

чтобы ваши зависимости выглядели как

"dependencies": {
    "express": "~4.11.x",
    "kerberos": "~0.0.x",
    "parse": "~1.8.0",
    "parse-server": "*",
    "underscore": "~1.8.0"
},

Нет больше Parse.Cloud.useMasterKey()

Используете ли вы Parse.Cloud.useMasterKey() в своем облачном коде? Вам нужно передать {useMasterKey:true} в любую функцию, для которой требуется мастер-ключ.

Ваши изменения кода должны выглядеть примерно так:

Parse.Cloud.define('getTotalMessageCount', function(request, response) {

  // Parse.Cloud.useMasterKey() <-- no longer available!

  var query = new Parse.Query('Messages');
  query.count({ useMasterKey: true }) // count() will use the master key to bypass ACLs
    .then(function(count) {
      response.success(count);
    });
});

Нет больше Parse.User.current()

Parse.User.current() больше не существует на сервере разбора. Облачный код, основанный на Parse.User.current(), должен вместо этого использовать request.user.

Возможно, вы используете Parse.User.current() для выполнения запросов к объектам с разрешениями на чтение, ограничивающими доступ к определенному пользователю. В этом случае вам нужно передать {sessionToken:token} в функцию find() вашего запроса:

// Parse Server Cloud Code
Parse.Cloud.define('getMessagesForUser', function(request, response) {
  //var user = Parse.User.current(); this no longer works
  var user = request.user; // instead use this
  var token = user.getSessionToken(); // get session token

  var query = new Parse.Query('Messages');
  query.equalTo('recipient', user);
  query.find({ sessionToken: token }) // pass the session token
    .then(function(messages) {
      response.success(messages);
    });
});

Следующие шаги

На этом этапе ваш сервер Parse должен работать. Тем не менее, каждое приложение отличается. Вот вещи, которые некоторым приложениям все же придется перенести:

  1. Вы используете толчок? Вам нужно настроить ваш Parse Server для push.
  2. Вы используете облачные задания? Эта функциональность не включена в Parse Server. Вам нужно создать собственное решение.
  3. Ваше приложение использует PFFile? По умолчанию Parse Server использует вашу базу данных MongoDB для хранения новых файлов. Это быстро станет дорогим, поэтому лучше использовать файловый адаптер. Ознакомьтесь с файловыми адаптерами Parse Server и репозиторием parse-files-utils.
  4. И за всем нужно следить. Возможно, вы захотите рассмотреть решение для мониторинга, такое как New Relic APM.

На этом мы завершаем нашу серию Parse Migration! Если вам нужна помощь в решении любых проблем, связанных с вашим сервером Parse, свяжитесь с нашей командой Go Nimbly. У нас есть инженеры с необходимыми навыками, чтобы подготовить миграцию Parse в прайм-тайм.

Go Nimbly — ведущий консультант по маркетингу и продажам для SaaS-компаний. Компания Go Nimbly, основанная и имеющая штаб-квартиру в Сан-Франциско, предоставляет клиентам индивидуальную команду для управления всем, от стратегии до реализации их систем маркетинга и продаж. Чтобы узнать больше, посетите gonimbly.com.