【问题标题】:Open Realm-JS Defined in Another .JS File打开在另一个 .JS 文件中定义的 Realm-JS
【发布时间】:2026-01-30 20:30:01
【问题描述】:

我正在尝试在 react-native 中使用 realm-js,所以我所做的是在我的操作文件夹中创建了一个 realm-js 类,就像在 中一样LoginActions.js,用户登录后写入数据。

我的问题是如何将相同的架构打开到另一个 .js 文件中?

在 LoginActions.js 中定义的 Realm-js:

class Login {
  get token() {
    return this.token;
  }
}

Login.schema = {
  name: 'Login',
  primaryKey: 'id',
  properties: {
    id: 'int',
    token: 'string',
  }
};

然后我用我的一些函数在这个模式中打开要写入和更新的领域。

喜欢:

// If Login User Success
Realm.open({ schema: [Login] })
.then(realm => {
  realm.write(() => {
    realm.create('Login', { id: 1, token });
  });
});

现在如果想将此架构打开到另一个 .js 文件中。我将如何打开它? 我想要的主要格式就像在 Loading.js 中一样:

import ????? from ????;

Realm.open(????????)
.then(realm => {
  realm.write(() => {
    const isUser = realm.create('Login', { id: 1, token }, true);
    if(isUser.length == 1) {
        // User Logs In Directly to Main Screen
    } else {
        // Show them Login Screen
    }
  });
});

【问题讨论】:

  • 您找到问题的答案了吗?

标签: node.js react-native realm


【解决方案1】:

您可以保存 Realm 实例并稍后在另一个 .js 文件中使用它。

不使用 Redux(推荐)

这是我推荐的使用方式,即使您在应用程序中使用 Redux。

架构和领域创建发生在一个 realm.js 文件中,该文件稍后会导入您代码中需要的任何位置。

realm.js 文件看起来像(带有 2 个示例架构):

import Realm from 'realm'; 

class Favorite extends Realm.Object {}
Favorite.schema = {
  name: 'Favorite',
  primaryKey: 'id', 
  properties: {
    id:     'string', 
    type:     'string', 
    favorite: 'bool', 
    alert: 'bool', 
    tag:     'string', 
    artistId: 'int'  
  }
};

class Friend extends Realm.Object {}
Friend.schema = {
  name: 'Friend',
  primaryKey: 'fbId',
  properties: {
    name: 'string',
    fbId:'string',  
    email: 'string',
    foto: 'string',
    concerts: 'int[]',
    artists: 'int[]'
  }
};

var schemasArray = [
  Favorite, 
  Friend

export default new Realm({schema: schemasArray});

然后,您可以从应用中的任何组件或文件中简单地执行以下操作:

import realm from './realm'

并在领域文档中使用它:

try {
  if(realm){
    realm.write(() => {
      //delete all objects first
      var allFavorites = realm.objects('Favorite');
      realm.delete(allFavorites);
    });
  }
} catch (e) {
  console.log(`Error deleting favorites: ${schema} - ${e}`);
  reject();
}

Redux 方式

如果您使用 Redux,您可以先将领域实例保存到应用程序状态,然后他们通过状态中的道具将其传递给任何组件。 编辑:最后结果非常相似,但是您添加了更多样板代码以将领域保存到商店中。

文件 1

Realm.open({ schema: [Login] })
.then(realm => {
  this.saveRealm( realm )
});

动作

saveRealm 是一个动作:

export function saveRealm( realm ) {
  return {
    type: types.SAVE_REALM,
    realm
  }
}

减速器

这将在减速器中处理:

export default function reducer(state = initialState, action = {}) {

  switch (action.type) {
    case types.SAVE_REALM:
      return Object.assign({}, state, {
        realm: action.realm
      });

      //other actions
    default:
       return state;
  }

文件 2

最后在其他文件 .js 中只使用保存的领域实例,无需再次打开它。

this.props.realm.write(() => {
    const isUser = this.props.realm.create('Login', { id: 1, token }, true);
   //rest of your code...
  });

您需要照常使用 mapStateToProps:

function mapStateToProps(state) {
  return {
    realm: state.realm,

编辑:将“Without Redux”设为推荐选项。添加更多代码示例代码。

【讨论】:

  • 是否有关于如何在没有 Redux 的情况下执行此操作的更新?在我的场景中,需要将领域作为道具传递到每个屏幕并不理想。谢谢。
  • 感谢您更新您的答案。不幸的是,官方领域文档没有显示如何异步打开领域(即Realm.open 而不是new Realm)并使用 es6 模块导出它
【解决方案2】:

抱歉,我错过了您问题中的Realm.open 细微差别。我一直在尝试以下方法,但尚未遇到任何问题,但我不确定这是“正确”的方法。

import Realm from "realm";
import { fromPromise } from "rxjs/observable/fromPromise";
import { share, mergeMap } from "rxjs/operators";

export const realmUser$ = fromPromise(
  Realm.Sync.User.login(...)
).pipe(share())

export const realm$ = realmUser$.pipe(
  mergeMap(user =>
    Realm.open({...})
  ),
  share()
);

除了一个或多个打开的领域之外,此模块还导出代表领域用户的可观察对象。这些模块的导出可以轻松地在您的应用中的其他地方使用。

import { realm$ } from "./sources/realm";
 
realm$.forEach(realm =>
  realm.write(() => {
    // TODO: Use the realm
  });
);

希望这能给你一些想法。此外,在 Redux 上下文中,您不需要或不想将领域本身存储在存储中,但很可能是 Realm.Result 对象。您可以使用redux-observable 来做到这一点。

原答案

realm-js git repo 中的示例不符合您的需求吗?

导出单个领域:

import Realm from 'realm';

class Todo extends Realm.Object {}
Todo.schema = {
    name: 'Todo',
    properties: {
        done: {type: 'bool', default: false},
        text: 'string',
    },
};

class TodoList extends Realm.Object {}
TodoList.schema = {
    name: 'TodoList',
    properties: {
        name: 'string',
        creationDate: 'date',
        items: {type: 'list', objectType: 'Todo'},
    },
};

export default new Realm({schema: [Todo, TodoList]});

在另一个文件中导入领域:

import realm from './realm';

【讨论】:

  • 不幸的是官方的例子已经过时并且没有显示与Realm.open的异步操作
  • 感谢您花时间更新答案。看到我们与Realm.open 异步打开,当我们在另一个文件中导入和使用realm$ 时,我们不需要await 吗?例如,我们必须let ourRealm = await realm$
  • realm$ 是 RxJS Observable 而不是承诺。如果您不熟悉可观察对象,我深表歉意,但我想向您展示什么对我有用。我使用 observables 而不是 Promise,因为它们更灵活,并且可以与其他潜在流组合,例如查询过滤数据、排序数据等的用户操作。
最近更新 更多