クイック スタート - Node.js SDK
項目一覧
このページには、Realm をアプリにすばやく統合するための情報が含まれています。
まだ行っていない場合は、Realm Node.js SDK をインストールします。
Realm のインポート
Realm を使用するソースファイルの先頭に、SDK と BSON ライブラリをインポートするための次の行を追加します。
import Realm, { BSON } from "realm";
オブジェクトモデルを定義する
アプリケーションのオブジェクトモデルによって、Realm 内に保存できるデータが定義されます。
Realm オブジェクトタイプを定義するには、タイプの name
とproperties
を指定する スキーマ オブジェクト を作成します。 タイプ名は、Realm 内のオブジェクトタイプ間で一意である必要があります。 特定のプロパティを定義する方法の詳細については、「オブジェクト プロパティの定義 」を参照してください。
次のコードは、 Task
オブジェクトのオブジェクトモデルを定義する方法を示しています。 この例では、次のことが行われます。
primaryKey
は タイプint
の_id
です。 プライマリキーに使用される別の一般的な型はObjectId です。name
フィールドは必須です。status
フィールドとowner_id
フィールドは任意であり、データ型の直後に疑問符で示されます。
export class QuickstartTask extends Realm.Object { static schema = { name: "Task", properties: { _id: "objectId", name: "string", status: "string?", owner_id: "string?", }, primaryKey: "_id", }; }
export class QuickstartTask extends Realm.Object<Task> { _id!: BSON.ObjectID; name!: string; status?: string; owner_id?: string; static schema: ObjectSchema = { name: "Task", properties: { _id: "objectId", name: "string", status: "string?", owner_id: "string?", }, primaryKey: "_id", }; }
Realm を開く
Realm を開くには、 Realm.BaseConfigurationオブジェクトをRealm.open() に渡します。
const realm = await Realm.open({ schema: [QuickstartTask], });
オブジェクトの検索、ソート、フィルタリング
次のコードは、次の方法を示しています。
"Task" オブジェクトタイプのすべてのインスタンスをクエリします。
クエリをフィルタリングして、「オープン」であるタスクのみを検索します。
タスクを 名前の昇順でソートします。
// Query for specific obect using primary key. const specificTask = realm.objectForPrimaryKey(QuickstartTask, testId); // Query realm for all instances of the "Task" type. const tasks = realm.objects(QuickstartTask); // Filter for all tasks with a status of "Open". const openTasks = tasks.filtered("status = 'Open'"); // Sort tasks by name in ascending order. const tasksByName = tasks.sorted("name");
Realm オブジェクトの作成、変更、削除
Realm を開くと、その中のオブジェクトを作成、変更、および削除できます。 すべての書込み (write) 操作は書込みトランザクション 内で発生する必要があります。
const allTasks = realm.objects(QuickstartTask); // Add a couple of Tasks in a single, atomic transaction. realm.write(() => { realm.create(QuickstartTask, { _id: firstId, name: "go grocery shopping", status: "Open", }); realm.create(QuickstartTask, { _id: secondId, name: "go exercise", status: "Open", }); }); const task1 = allTasks.find( (task) => task._id.toString() == firstId.toString() ); const task2 = allTasks.find( (task) => task._id.toString() == secondId.toString() ); realm.write(() => { // Modify an object. task1!.status = "InProgress"; // Delete an object. realm.delete(task2!); });
コレクションの監視
Realm.addLister() でイベント ハンドラーを登録することで、Realm 、コレクション、またはオブジェクトの変更 を監視できます。Object.addLister() Collection.addLister()メソッド。
重要
順序は重要
コレクション通知ハンドラーでは、削除、挿入、変更の順に常に変更を適用します。 削除前に挿入を処理すると、予期しない動作が発生する可能性があります。
次の例では、アプリケーション開発者はTask
コレクションの変更を監視しています。
// Define the collection notification listener. const listener = (tasks, changes) => { // Update UI in response to deleted objects. changes.deletions.forEach((index) => { // Deleted objects cannot be accessed directly, // but we can update a UI list, etc. knowing the index. console.log(`A task was deleted at the ${index} index.`); // ... }); // Update UI in response to inserted objects. changes.insertions.forEach((index) => { const insertedTasks = tasks[index]; console.log(`insertedTasks: ${JSON.stringify(insertedTasks, null, 2)}`); // ... }); // Update UI in response to modified objects. // `newModifications` contains an index to the modified object's position // in the collection after all deletions and insertions have been applied. changes.newModifications.forEach((index) => { const modifiedTask = tasks[index]; console.log(`modifiedTask: ${JSON.stringify(modifiedTask, null, 2)}`); // ... }); }; // Observe collection notifications. tasks.addListener(listener);
// Define the collection notification listener. //@ts-expect-error TYPEBUG: OrderedCollection is incorrectly implemented const listener: Realm.CollectionChangeCallback = ( tasks: Realm.OrderedCollection<QuickstartTask>, changes: Realm.CollectionChangeSet ) => { // Update UI in response to deleted objects. changes.deletions.forEach((index) => { // Deleted objects cannot be accessed directly, // but we can update a UI list, etc. knowing the index. console.log(`A task was deleted at the ${index} index.`); // ... }); // Update UI in response to inserted objects. changes.insertions.forEach((index) => { const insertedTasks = tasks[index]; console.log(`insertedTasks: ${JSON.stringify(insertedTasks, null, 2)}`); // ... }); // Update UI in response to modified objects. // `newModifications` contains an index to the modified object's position // in the collection after all deletions and insertions have been applied. changes.newModifications.forEach((index) => { const modifiedTask = tasks[index]; console.log(`modifiedTask: ${JSON.stringify(modifiedTask, null, 2)}`); // ... }); }; // Observe collection notifications. //@ts-expect-error TYPEBUG: OrderedCollection is incorrectly implemented tasks.addListener(listener);
Realm を閉じる
Realm.close()の呼び出し メソッドを Realm インスタンスで実行し、メモリリークを回避するために使用されます。
// Close the realm. realm.close();
Device Sync の追加(任意)
このセクションでは、匿名ユーザーで認証し、Flexible Sync レルムを開いてデバイス間でデータを同期する方法について説明します。
前提条件
App Services UI で有効になっている匿名認証
開発モード がオンになっていて、 セクションの フィールドで有効になっている Flexible Sync
owner_id
Queryable Fields
アプリを初期化する
認証や同期などの App Services 機能を使用するには、まず App Services App ID を使用して App Services App にアクセスする必要があります。 アプリ ID は、App Services UI で確認できます。
// Initialize your App. const app = new Realm.App({ id: "<yourAppId>", });
ユーザーの認証
ユーザーを認証してログインするには、 App.logIn()を呼び出します。 匿名認証が有効になっている場合、ユーザーは識別情報を提供することなく、アプリにすぐにログインできます。
// Initialize your App. const app = new Realm.App({ id: "<yourAppId>", }); // Authenticate an anonymous user. const anonymousUser = await app.logIn(Realm.Credentials.anonymous());
オブジェクトモデルを定義する
同期された Realm のオブジェクトモデルは、ローカル専用の Realmと同じように動作します。 ローカル専用の Realm の場合と同様に、オブジェクトモデルを定義します。
export class QuickstartTask extends Realm.Object { static schema = { name: "Task", properties: { _id: "objectId", name: "string", status: "string?", owner_id: "string?", }, primaryKey: "_id", }; }
export class QuickstartTask extends Realm.Object<Task> { _id!: BSON.ObjectID; name!: string; status?: string; owner_id?: string; static schema: ObjectSchema = { name: "Task", properties: { _id: "objectId", name: "string", status: "string?", owner_id: "string?", }, primaryKey: "_id", }; }
同期された Realm を開く
アプリを初期化し、ユーザーを認証し、オブジェクトモデルを定義したら、 SyncConfiguration を作成できます。
Flexible Sync レルムを開くには、 Realm.open()を呼び出します。 baseConfiguration オブジェクトをsync
渡します。このオブジェクトには、SyncConfiguration オブジェクト を定義する プロパティが含まれている必要があります。Flexible Sync を使用するには、SyncConfiguration にuser
とflexible: true
を含む を含める必要があります。
さらに、Realm からの読み取りや書込みを行う前に、少なくとも 1 つのサブスクリプションが必要です。 Realm ファイルが最初に開かれたときに初期サブスクリプションセットを定義するには、 Configuration.sync.initialSubscriptions
を使用します。
// Initialize your App. const app = new Realm.App({ id: "<yourAppId>", }); // Authenticate an anonymous user. const anonymousUser = await app.logIn(Realm.Credentials.anonymous()); // Create a `SyncConfiguration` object. const config = { schema: [QuickstartTask], sync: { // Use the previously-authenticated anonymous user. user: anonymousUser, // Set flexible sync to true to enable sync. flexible: true, // Define initial subscriptions to start syncing data as soon as the // realm is opened. initialSubscriptions: { update: (subs, realm) => { subs.add( // Get objects that match your object model, then filter them by // the `owner_id` queryable field realm .objects(QuickstartTask) .filtered(`owner_id == "${anonymousUser.id}"`) ); }, }, }, }; const realm = await Realm.open(config);
// Initialize your App. const app = new Realm.App({ id: "<yourAppId>", }); // Authenticate an anonymous user. const anonymousUser = await app.logIn(Realm.Credentials.anonymous()); // Create a `SyncConfiguration` object. const config: Realm.Configuration = { schema: [QuickstartTask], sync: { // Use the previously-authenticated anonymous user. user: anonymousUser, // Set flexible sync to true to enable sync. flexible: true, // Define initial subscriptions to start syncing data as soon as the // realm is opened. initialSubscriptions: { update: (subs, realm) => { subs.add( // Get objects that match your object model, then filter them by // the `owner_id` queryable field realm .objects(QuickstartTask) .filtered(`owner_id == "${anonymousUser.id}"`) ); }, }, }, }; const realm = await Realm.open(config);
同期された Realm で を読み取り、書込み、変更を監視する構文は、上記の同期されていない Realm の構文と同じです。 ローカル データを操作している間に、バックグラウンド スレッドが変更セットを効率的に統合、アップロード、ダウンロードします。