feathers-nedb
feathers-nedb copied to clipboard
A service using NeDB, an embedded datastore for Node.js
feathers-nedb
feathers-nedb is a database service adapter for NeDB, an embedded datastore with a MongoDB like API. NeDB can store data in-memory or on the filesystem which makes it useful as a persistent storage without a separate database server.
$ npm install --save @seald-io/nedb feathers-nedb
Important:
feathers-nedb
implements the Feathers Common database adapter API and querying syntax.
API
service(options)
Returns a new service instance initialized with the given options. Model
has to be an NeDB database instance.
const NeDB = require('@seald-io/nedb');
const service = require('feathers-nedb');
// Create a NeDB instance
const Model = new NeDB({
filename: './data/messages.db',
autoload: true
});
app.use('/messages', service({ Model }));
app.use('/messages', service({ Model, id, events, paginate }));
Options:
-
Model
(required) - The NeDB database instance. See the NeDB API for more information. -
id
(optional, default:'_id'
) - The name of the id field property. By design, NeDB will always add an_id
property. -
events
(optional) - A list of custom service events sent by this service -
paginate
(optional) - A pagination object containing adefault
andmax
page size -
whitelist
(optional) - A list of additional query parameters to allow (e.g.[ '$regex' ]
) -
multi
(optional) - Allowcreate
with arrays andupdate
andremove
withid
null to change multiple items. Can betrue
for all methods or an array of multi methods (e.g.[ 'remove', 'create' ]
)
params.nedb
When making a service method call, params
can contain an nedb
property which allows to pass additional NeDB options, for example to allow upsert
:
app.service('messages').update('someid', {
text: 'This message will be either created or updated'
}, {
nedb: { upsert: true }
});
use of params on client
On client you can't pass anything other than a query as the parameter. So you need to do it like this.
// client side
app.service('messages').update('someid', {
text: 'This message will be either created or updated'
}, {
query: {nedb: { upsert: true }}
});
then add a hook to the service to move the nedb options to the params object
ctx => {
const nedb = ctx.params.query.nedb;
if (nedb) {
ctx.params.nedb = nedb;
delete ctx.params.query.nedb;
}
return ctx;
}
Example
Here is an example of a Feathers server with a messages
NeDB service that supports pagination and persists to db-data/messages
:
$ npm install @feathersjs/feathers @feathersjs/errors @feathersjs/express @feathersjs/socketio feathers-nedb nedb
In app.js
:
const feathers = require('@feathersjs/feathers');
const express = require('@feathersjs/express');
const socketio = require('@feathersjs/socketio');
const NeDB = require('@seald-io/nedb');
const service = require('feathers-nedb');
const db = new NeDB({
filename: './db-data/messages',
autoload: true
});
// Create an Express compatible Feathers application instance.
const app = express(feathers());
// Turn on JSON parser for REST services
app.use(express.json());
// Turn on URL-encoded parser for REST services
app.use(express.urlencoded({extended: true}));
// Enable REST services
app.configure(express.rest());
// Enable Socket.io services
app.configure(socketio());
// Connect to the db, create and register a Feathers service.
app.use('/messages', service({
Model: db,
paginate: {
default: 2,
max: 4
}
}));
// Set up default error handler
app.use(express.errorHandler());
// Create a dummy Message
app.service('messages').create({
text: 'Message created on server'
}).then(message => console.log('Created message', message));
// Start the server.
const port = 3030;
app.listen(port, () => {
console.log(`Feathers server listening on port ${port}`);
});
Run the example with node app
and go to localhost:3030/messages.
License
Copyright (c) 2019
Licensed under the MIT license.