| name | surrealdb-js |
| description | Using SurrealDB from JavaScript and TypeScript with the official surrealdb SDK, covering connecting (WebSocket/HTTP and embedded engines), authentication, CRUD, parameterized queries, and live queries. Use when connecting to SurrealDB from Node, Deno, Bun, or the browser, using the surrealdb npm package, or performing CRUD and real-time operations from JS/TS code. Triggers: surrealdb JS, surrealdb.js, new Surreal(), db.query, db.create, db.live, TypeScript SDK, npm i surrealdb. |
| metadata | {"author":"surrealdb","version":"0.2.0"} |
SurrealDB JavaScript SDK
The official SDK (surrealdb on npm) works in Node.js, Deno, Bun, and the
browser. It connects to a remote SurrealDB instance over WebSocket/HTTP, or runs
an embedded engine in-process. Target the latest stable surrealdb release;
install without pinning (npm i surrealdb) unless the user requires a specific
version.
Installation
npm i surrealdb
Connect & select namespace/database
Always connect, then use a namespace + database, then authenticate. Close
the connection when finished.
import { Surreal } from "surrealdb";
const db = new Surreal();
await db.connect("ws://127.0.0.1:8000/rpc");
await db.use({ namespace: "test", database: "test" });
await db.signin({ username: "root", password: "root" });
await db.close();
Run a local server with surreal start -u root -p root rocksdb:mydb (or
in-memory with surreal start -u root -p root). To run SurrealDB in-process
with no server, see references/embedded.md.
Authentication
await db.signin({ username: "root", password: "root" });
await db.signin({ namespace: "test", username: "ns_user", password: "..." });
await db.signin({ namespace: "test", database: "test", username: "db_user", password: "..." });
const token = await db.signin({
namespace: "test",
database: "test",
access: "user",
variables: { email: "a@b.com", pass: "secret" },
});
await db.signup({
namespace: "test",
database: "test",
access: "user",
variables: { email: "a@b.com", pass: "secret" },
});
await db.authenticate(token);
await db.invalidate();
const me = await db.info();
CRUD
Pass a table as a string ("person") or a RecordId for a specific record.
See references/data-types.md for RecordId, Table,
Duration, Decimal, and other value classes.
import { RecordId } from "surrealdb";
interface Person { id: RecordId; name: string; age?: number; }
await db.create<Person>("person", { name: "Tobie" });
await db.create<Person>(new RecordId("person", "tobie"), { name: "Tobie" });
const people = await db.select<Person>("person");
const tobie = await db.select<Person>(new RecordId("person", "tobie"));
await db.update<Person>(new RecordId("person", "tobie"), { name: "Tobie", age: 30 });
await db.upsert<Person>(new RecordId("person", "tobie"), { name: "Tobie" });
await db.merge<Person>("person", { active: true });
await db.patch(new RecordId("person", "tobie"), [
{ op: "replace", path: "/name", value: "Tobie M H" },
]);
await db.insert<Person>("person", [{ name: "A" }, { name: "B" }]);
await db.relate(new RecordId("person", "tobie"), "wrote", new RecordId("article", "surreal"));
await db.delete("person");
await db.delete(new RecordId("person", "tobie"));
Queries
db.query<T>(sql, vars) runs raw SurrealQL and returns an array with one entry
per statement. Always pass user input via bound parameters, never string
interpolation.
const [people, count] = await db.query<[Person[], number]>(
`SELECT * FROM person WHERE age > $min;
SELECT count() FROM person GROUP ALL;`,
{ min: 18 },
);
const [found] = await db.query<[Person[]]>(
"SELECT * FROM person WHERE id = $who",
{ who: new RecordId("person", "tobie") },
);
Other helpers: db.let(name, value) / db.unset(name) set session parameters
usable as $name in later queries; db.run(fnName, version, args) invokes a
defined function; db.queryRaw() returns the unparsed RPC response (status +
timing per statement).
Live queries
Subscribe to real-time changes on a table with db.live(). Requires a
WebSocket (or embedded) connection — not HTTP. See
references/live-queries.md.
const queryUuid = await db.live<Person>("person", (action, result) => {
console.log(action, result);
});
await db.kill(queryUuid);
References
Resources