JavaScript Local Database
In-memory database for Node with no dependencies. jsldb is type safe, fast, and easy to use.
jsldb is intended for rapid prototyping and other non-critical use-cases. Get functionality similar to mongoose without needing to spin up an instance.
NOTE: This project is in a relatively untested state. Although I have a number of synthetic tests set up, it has not been tested 'in the field'. I would greatly appreciate you giving it a try and reporting any bugs you find or features you'd like to see!
Getting Started
Have a look at the docs for in-depth information about methods and a few tutorials.
Basic principles
See glossary
jsldb offers a relational database that can contain any number of tables
.
A table is a named object that contains any number of entries
, each of which is referenced by a UUID.
Each of these entries must conform to a rigid schema that ensures that the types conform.
Upon insertion of a new entry, the entry is compared against the schema for type, and optionally to ensure that the field
has a defined value.
Accessing an entry directly via its id is a quick operation thanks to V8 optimizations (see this V8 devblog for more info).
A table can also be searched using one of several query functions. Each of these query functions take a query object that defines rules for matching entries. Queries return an object containing the entry or entries which match the given query object, with each entry's id as its key.
Example
const express = require('express')
const app = express()
const jsldb = require('jsldb')
const bodyParser = require('body-parser')
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
const tables = {
table1: {
field1: {
type: 'string',
required: true
},
field2: {
type: 'array number',
required: true
},
field3: {
type: 'array id table2'
}
},
table2: {
field1: {
type: 'date',
required: true
},
field2: {
type: 'id table1'
}
}
}
const db = jsldb.connect('newdb', tables)
app.get('/table1/:id', (req, res) => {
db.findById('table1', req.params.id, (err, data) => {
if (err) res.render('error', { error: err })
else res.render('table1', data)
})
})
app.get('/table/q/:query', (req, res) => {
db.findAll(
new Query('table1', 'field1', 'eq', 'some string'),
(err, entries) => {
if (err) res.render('error', { error: err })
else res.render('query', { results: entries })
}
)
})
app.post('/table1', (req, res) => {
// Pass data from the browser to the server wrapped inside an object named entry attached to the request body
db.insert('table1', req.body.entry, (err, data) => {
if (err) res.render('error', { error: err })
else res.redirect('/table1')
})
})
app.delete('/table1/:id', (req, res) => {
db.deleteById('table1', req.params.id, (err, data) => {
if (err) res.render('error', { error: err })
else res.redirect('/')
})
})
app.listen(8080, '127.0.0.1')