NodeJS SDK访问本地RealmDB时查询结果始终为空的问题排查
问题排查与解决方案
你的核心问题是NodeJS SDK打开的是一个新的空Realm数据库,而非你用Realm Studio创建的已有数据文件,所以查询不到结果。以下是具体排查和修复步骤:
1. 修正数据库路径
Realm NodeJS SDK的path参数需要指定完整的文件名(包含.realm后缀),否则会自动创建一个新的空数据库文件。你当前代码里写的path: 'olam1'会让SDK创建一个新的olam1.realm空文件,而非打开你已有的那个。
修改路径为:
path: 'olam1.realm',
如果不确定当前工作目录,可以先打印确认:
console.log('当前工作目录:', process.cwd());
确保olam1.realm确实在这个目录下,或者直接使用绝对路径避免歧义:
const path = require('path'); // ... path: path.join(__dirname, 'olam1.realm'),
2. 添加只读模式(可选但推荐)
因为你只是读取已有数据库,添加readOnly: true参数可以确保SDK不会创建新文件,而是严格读取指定路径的现有文件:
const realm = await Realm.open({ path: path.join(__dirname, 'olam1.realm'), schema: [OlamDBSchema], readOnly: true, });
3. 验证Schema完全匹配
Realm对Schema的匹配要求非常严格,任何不匹配都会导致SDK无法识别已有数据:
- 确认Realm Studio中的表名是
OLAM_DB(大小写完全一致) - 确认每个字段的名称、类型、可选性和代码中的Schema完全一致:
_id:必须是string类型且为主键english_word:string类型(非可选)part_of_speech:可选string类型(Studio中对应字段允许为空)malayalam_definition:string类型(非可选)
修正后的完整代码示例
const Realm = require('realm'); const path = require('path'); const OlamDBSchema = { name: 'OLAM_DB', primaryKey: '_id', properties: { _id: 'string', english_word: 'string', part_of_speech: 'string?', malayalam_definition: 'string', }, }; async function execute() { try { console.log('当前工作目录:', process.cwd()); const realm = await Realm.open({ path: path.join(__dirname, 'olam1.realm'), schema: [OlamDBSchema], readOnly: true, }); const dict = realm.objects('OLAM_DB'); console.log('总数据量:', dict.length); // 先查看总数据是否为0 const result = dict.filtered("english_word == 'Abduct'"); console.log('查询结果数量:', result.length); console.log('数据库是否为空:', realm.isEmpty); realm.close(); } catch (error) { console.error('错误:', error); } } execute();
额外排查点
- 检查
olam1.realm文件的权限:确保NodeJS进程有读取该文件的权限(OSX下可以右键文件→显示简介→共享与权限) - 确认Realm Studio中确实存在
english_word为Abduct的记录,且拼写完全一致(大小写敏感)
内容的提问来源于stack exchange,提问作者Nithin CV
相关产品推荐
相关产品推荐

