如何在Tauri项目中嵌入SurrealDB并使用其JavaScript库?
Tauri中嵌入SurrealDB并通过JavaScript库交互
问题概述
使用Tauri开发桌面应用,需要在客户端本地通过SurrealDB存储数据,支持两种方式:指定本地路径存储,或类似浏览器IndexedDB的存储方式。使用官方JavaScript库时遇到URL格式错误,同时需要实现单客户端读取能力并使用SurrealQL查询。
现有代码执行new Surreal('file//:C:/Programmering')时触发错误:
Uncaught InvalidURLProvided: The provided string is either not a URL or is a URL but with an invalid protocol!
错误原因
URL格式不符合规范:file//:C:/Programmering 缺少一个斜杠,正确的file协议URL格式应为file:///[路径](三个斜杠)。
解决方案
方案1:指定本地文件路径存储
- 修正URL格式:将路径改为
file:///C:/Programmering - 适配Tauri的本地路径:推荐使用Tauri的
pathAPI获取应用专属数据目录,避免硬编码系统路径,提升跨平台兼容性。
修正后的代码示例:
import Surreal from "surrealdb.js"; import { appDataDir } from "@tauri-apps/api/path"; export const getSurrealClient = async () => { // 获取Tauri应用的专属数据目录 const dataPath = await appDataDir(); // 构造正确的file协议URL const dbUrl = `file:///${dataPath.replace(/\\/g, "/")}`; const db = new Surreal(dbUrl); await db.signin({ user: 'root', pass: 'root' }); await db.use({ ns: 'namespace', db: 'mydb' }); return db; }
方案2:IndexedDB存储(类浏览器模式)
SurrealDB的JavaScript库支持local://协议,会自动将数据存储到IndexedDB中,无需指定本地文件路径,完全适配Tauri的WebView环境。
代码示例:
import Surreal from "surrealdb.js"; export const getSurrealClient = async () => { // 使用local协议自动存储到IndexedDB const db = new Surreal('local://'); await db.signin({ user: 'root', pass: 'root' }); await db.use({ ns: 'namespace', db: 'mydb' }); return db; }
基础使用示例(单客户端读取+SurrealQL)
初始化客户端后,即可使用SurrealQL进行数据操作,满足单客户端读取需求:
// 插入数据 await db.query(` INSERT INTO user SET name = 'John Doe', age = 30; `); // 查询数据 const result = await db.query(` SELECT * FROM user WHERE age > 25; `); console.log(result[0].result);
内容的提问来源于stack exchange,提问作者Ólavur Nón
相关产品推荐
相关产品推荐

