NCMBサービス終了に伴いBack4Appへ移行した話

　昨年暮れに、ニフティクラウドモバイルバックエンド（NCMB）サービスが今年度末で終了になるというアナウンスされましたが、移行先の選定や実際の移行手続きや設定変更で色々試行錯誤したので、他にも困っている方の参考になるかもしれないので記事に残しておきます。

　最初に断っておきますが、ニフティの方が移行方法についてはかなり親切にBlog記事等で紹介されています。

 [　リンク：ニフクラ mobile backendのデータストアをParse Serverに移行する　](https://qiita.com/goofmint/items/efa951804f6db755a14d)

　移行先の筆頭は、Parseというオープンソースのソフトを自前のインフラで構築して対応する方法が挙げられており、確かにデータストア等のコマンドもNCMBのSDKにかなり似ており、移行が楽になることが理由のようです。ただし、MongoDB　Atlasのアカウントを作成し、Parse Serverからの接続を設定したり、Serverとは別にPase DashBoardを構築する必要もあり、自前の方法ではそれなりの手間がかかるようになります。

　ここで先に結論を書くと、Parseをベースに各種機能（DashBoard等）を統合した”Back4App”という
BaaSクラウドサービスがあり、移行を無事完了出来たので、以下簡単な経緯と注意点を含めた具体的な移行方法を紹介します（実は”Back4App”は、Bing AIに教えてもらいました）。

１. Back4Appに行き着いた簡単な経緯
　私の場合はモバイルアプリの開発をReact-Native/Expoでやっているので、React-Native又はJavascript系のSDKのサポートが必要でした。Parse自体にJSのSDKがあり、NodeとReact-Nativeの両方に対応しているので、これが使えるBaaSをAIに質問して探しました。他にも幾つか選択肢がありましたが、一番ストレートで手間を掛けずに使えそうなのがBack4Appだったと言うわけです。

２. Back4Appへの具体的移行方法

①NCMBからエクスポートしたデータをBack4Appに読み込ませる
 これはニフティさんのBlogに詳しいので、簡単な紹介に留めます。ちゃんとニフティさんが以下のリンクで移行ツールを用意して頂いているので、これを使ってエクスポートしたJSONファイルをBack4Appに読み込ませます。

 [　リンク：ニフクラさんの移行ツールリポジトリ　](https://github.com/NCMBMania/ncmb2parse.git)

 私の場合は、datastore.jsを使わせてもらいました。

```node:console
データストアの場合:
npx node dist/datastore.js -a "Application ID" -m "Master key" -j "JavaScript key" -k "REST API key" -n "Class Name" -u 'https://parseapi.back4app.com/' ./path_to_export_ncmb/datastore.json
インストレーションの場合:
npx node dist/push.js -a "Application ID" -k "REST API key" -u 'https://parseapi.back4app.com/' ./path_to_export_ncmb/installation.json
会員データの場合：
npx node dist/user.js -a "Application ID" -k "REST API key" -u 'https://parseapi.back4app.com/'　./path_to_export_ncmb/users.json
```

　ここで使用する"Application ID"、"JavaScript key"、"Master key"、"REST API key"は、Back4Appの DashBoard　> App Settings > Security & Keysから取得します。また、"Class Name"は事前にDashBoardの"Create a Class"で新規作成したClassの名前を設定して下さい。ちなみにClass名を設定できるのはdatastore.jsだけのようだったので、私は全てのデータをdatastore.jsのみで読み込ませました（ニフティさんのブログでは"Master key"は不要でしたが、これが無いと機能しませんでした）。また、DashBoardには右上の3点メニューボタンからImport/Export機能が使えるようですが、私は上手く処理出来ませんでした（CSVファイルは機能するようですが、JSONはダメでした）。

②アプリ側の修正
　アプリ側でNCMBにアクセスしている場合は修正が必要なので、自分の環境に合ったSDK等を使って修正しますが、基本的な使い方はニフティさんも書いているようにNCMBとかなり近いので、Back4Appのドキュメントを参考に修正して下さい。以下はReact-Native版での修正時の注意点と対応策になります。

 [　リンク：Back4Appのドキュメント　](https://www.back4app.com/docs/get-started/welcome)

　私のようにReact-Native/Expoを利用している場合は、Parse-SDK-JSのReact-Native版にバグがあるため、アプリがエラーで起動しなくなります（Node版は大丈夫なので、import Parse from "parse/react-native.js"利用時特有の問題です）。深くは追求していませんが、JSに後から追加されたPrivateメソッド/プロパティに関連したEventEmitterのエラーで、Parse内のReact-Native用のモジュールが、本家のReact-NativeのPrivateメソッド/プロパティを使用しているEventEmitterを読み込んでいるために発生しているようです。このエラーを解消するにはParse内のReact-Native用EventEmitter.jsモジュールを下記のように書き換えると上手く動作するようになります（これはNode版のEventEmitter.jsのコードと同じものです）。これはBack4AppではなくParse本体のReact-Native版に起因する問題なので、自前サーバーでParseを構築する場合も、React-Native版を使う場合には、おそらく同じ問題が発生するのではないかと推測されます。

```node_modules/parse/lib/react-native/EventEmitter.js
修正前:
var EventEmitter;
try {
  EventEmitter = require('react-native/Libraries/vendor/emitter/EventEmitter');
  if (EventEmitter.default) {
    EventEmitter = EventEmitter.default;
  }
  EventEmitter.prototype.on = EventEmitter.prototype.addListener;
} catch (_) {}
module.exports = EventEmitter;

修正後:
module.exports = require('events').EventEmitter;
var EventEmitter;

npx expo install events　　//eventsモジュールのインストール
```

　更に、アプリをビルドする際に上記変更がリセットされないように、patch-packageを使って下記の設定をします。


```patch-package.のインストール
npx expo install patch-package
```
```package.jsonの"script"に下記を追加
    "scripts": {
    +  "postinstall": "patch-package"
 }
```

　これでアプリを起動すると自動的にpatchesフォルダがrootに作成され、以下のようなファイルが生成されます。


```patches.フォルダ
    +  parse+4.3.1.patch
```
　以上がアプリ側の修正方法と注意点になります。

３． まとめ
　今回はNCMBからBack4AppへのMBaaS間の移行方法と注意点を紹介させてもらいました。NCMBには長い期間大変お世話になり、本当に感謝しております。今回の移行処理の対応を通して、改めてNCMBの有難さを痛感しました。また残念ながら海外のMBaaSプロバイダーにデータを預ける不安は残ったままです。
 今後生成AI向けのベクトルDBなどがBaaSの対象として浮上してきている様なので、国内でも取り組んで頂けるプレイヤーが増えることを願っています。