Moleculer service to store entities in database.
- default CRUD actions
- cached actions
- pagination support
- pluggable adapter (NeDB is the default memory adapter for testing & prototyping)
- official adapters for MongoDB, PostgreSQL, SQLite, MySQL, MSSQL.
- fields filtering
- populating
- encode/decode IDs
- entity lifecycle events for notifications
$ npm install moleculer-db --save
"use strict";
const { ServiceBroker } = require("moleculer");
const DbService = require("moleculer-db");
const broker = new ServiceBroker();
// Create a DB service for `user` entities
broker.createService({
name: "users",
mixins: [DbService],
settings: {
fields: ["_id", "username", "name"]
},
afterConnected() {
// Seed the DB with ˙this.create`
}
});
broker.start()
// Create a new user
.then(() => broker.call("users.create", {
username: "john",
name: "John Doe",
status: 1
}))
// Get all users
.then(() => broker.call("users.find").then(console.log));
// List users with pagination
.then(() => broker.call("users.list", { page: 2, pageSize: 10 }).then(console.log));
// Get a user
.then(() => broker.call("users.get", { id: 2 }).then(console.log));
// Update a user
.then(() => broker.call("users.update", { id: 2, name: "Jane Doe" }).then(console.log));
// Delete a user
.then(() => broker.call("users.remove", { id: 2 }).then(console.log));
Property | Type | Default | Description |
---|---|---|---|
idField |
String |
required | Name of ID field. |
fields |
Array.<String> |
null |
Field filtering list. It must be an Array . If the value is null or undefined doesn't filter the fields of entities. |
excludeFields |
Array.<String> |
null |
Exclude fields from list. It must be an Array . |
populates |
Array |
null |
Schema for population. Read more. |
pageSize |
Number |
required | Default page size in list action. |
maxPageSize |
Number |
required | Maximum page size in list action. |
maxLimit |
Number |
required | Maximum value of limit in find action. Default: -1 (no limit) |
entityValidator |
Object , function
|
null |
Validator schema or a function to validate the incoming entity in create & 'insert' actions. |
Note:
idField
does not work with Sequelize adapter as you can freely set your own ID while creating the model.
Find entities by query.
Property | Type | Default | Description |
---|---|---|---|
populate |
String , Array.<String>
|
required | Populated fields. |
fields |
String , Array.<String>
|
required | Fields filter. |
limit |
Number |
- | Max count of rows. |
offset |
Number |
- | Count of skipped rows. |
sort |
String |
- | Sorted fields. |
search |
String |
- | Search text. |
searchFields |
String , Array.<String>
|
required | Fields for searching. |
query |
Object |
- | Query object. Passes to adapter. |
Type: Array.<Object>
List of found entities.
Get count of entities by query.
Property | Type | Default | Description |
---|---|---|---|
search |
String |
- | Search text. |
searchFields |
String , Array.<String>
|
required | Fields list for searching. |
query |
Object |
- | Query object. Passes to adapter. |
Type: Number
Count of found entities.
List entities by filters and pagination results.
Property | Type | Default | Description |
---|---|---|---|
populate |
String , Array.<String>
|
required | Populated fields. |
fields |
String , Array.<String>
|
required | Fields filter. |
page |
Number |
- | Page number. |
pageSize |
Number |
- | Size of a page. |
sort |
String |
- | Sorted fields. |
search |
String |
- | Search text. |
searchFields |
String , Array.<String>
|
required | Fields for searching. |
query |
Object |
- | Query object. Passes to adapter. |
Type: Object
List of found entities and count with pagination info.
Create a new entity.
Property | Type | Default | Description |
---|---|---|---|
params |
Object |
required | Entity to save. |
Type: Object
Saved entity.
Create many new entities.
Property | Type | Default | Description |
---|---|---|---|
entity |
Object |
- | Entity to save. |
entities |
Array.<Object> |
- | Entities to save. |
Type: Object
, Array.<Object>
Saved entity(ies).
Get entity by ID.
Property | Type | Default | Description |
---|---|---|---|
id |
any , Array.<any>
|
required | ID(s) of entity. |
populate |
String , Array.<String>
|
required | Field list for populate. |
fields |
String , Array.<String>
|
required | Fields filter. |
mapping |
Boolean |
- | Convert the returned Array to Object where the key is the value of id . |
Type: Object
, Array.<Object>
Found entity(ies).
Update an entity by ID.
After update, clear the cache & call lifecycle events.
Property | Type | Default | Description |
---|---|---|---|
id |
any |
required | ID of entity. |
Type: Object
Updated entity.
Remove an entity by ID.
Property | Type | Default | Description |
---|---|---|---|
id |
any |
required | ID of entity. |
Type: Number
Count of removed entities.
Sanitize context parameters at find
action.
Property | Type | Default | Description |
---|---|---|---|
ctx |
Context |
required | |
params |
Object |
required |
Type: Object
Get entity(ies) by ID(s).
Property | Type | Default | Description |
---|---|---|---|
id |
any , Array.<any>
|
required | ID or IDs. |
decoding |
Boolean |
- | Need to decode IDs. |
Type: Object
, Array.<Object>
Found entity(ies).
Clear the cache & call entity lifecycle events
Property | Type | Default | Description |
---|---|---|---|
type |
String |
required | |
json |
Object , Array.<Object> , Number
|
required | |
ctx |
Context |
required |
Type: Promise
Clear cached entities
Property | Type | Default | Description |
---|---|---|---|
No input parameters. |
Type: Promise
Transform the fetched documents
Property | Type | Default | Description |
---|---|---|---|
ctx |
Context |
required | |
params |
Object |
required | |
docs |
Array , Object
|
required |
Type: Array
, Object
Validate an entity by validator.
Property | Type | Default | Description |
---|---|---|---|
entity |
Object |
required |
Type: Promise
Encode ID of entity.
Property | Type | Default | Description |
---|---|---|---|
id |
any |
required |
Type: any
Decode ID of entity.
Property | Type | Default | Description |
---|---|---|---|
id |
any |
required |
Type: any
Find entities by query.
Property | Type | Default | Description |
---|---|---|---|
ctx |
Context |
required | Context instance. |
params |
Object |
- | Parameters. |
Type: Array.<Object>
List of found entities.
Get count of entities by query.
Property | Type | Default | Description |
---|---|---|---|
ctx |
Context |
required | Context instance. |
params |
Object |
- | Parameters. |
Type: Number
Count of found entities.
List entities by filters and pagination results.
Property | Type | Default | Description |
---|---|---|---|
ctx |
Context |
required | Context instance. |
params |
Object |
- | Parameters. |
Type: Object
List of found entities and count.
Create a new entity.
Property | Type | Default | Description |
---|---|---|---|
ctx |
Context |
required | Context instance. |
params |
Object |
- | Parameters. |
Type: Object
Saved entity.
Create many new entities.
Property | Type | Default | Description |
---|---|---|---|
ctx |
Context |
required | Context instance. |
params |
Object |
- | Parameters. |
Type: Object
, Array.<Object>
Saved entity(ies).
Get entity by ID.
Property | Type | Default | Description |
---|---|---|---|
ctx |
Context |
required | Context instance. |
params |
Object |
- | Parameters. |
Type: Object
, Array.<Object>
Found entity(ies).
Update an entity by ID.
After update, clear the cache & call lifecycle events.
Property | Type | Default | Description |
---|---|---|---|
ctx |
Context |
required | Context instance. |
params |
Object |
- | Parameters. |
Type: Object
Updated entity.
Remove an entity by ID.
Property | Type | Default | Description |
---|---|---|---|
ctx |
Context |
required | Context instance. |
params |
Object |
- | Parameters. |
The service supports to populate fields from other services.
E.g.: if you have an author
field in post
entity, you can populate it with users
service by ID of author. If the field is an Array
of IDs, it will populate all entities via only one request.
Example of populate schema
broker.createService({
name: "posts",
mixins: [DbService],
settings: {
populates: {
// Shorthand populate rule. Resolve the `voters` values with `users.get` action.
"voters": "users.get",
// Define the params of action call. It will receive only with username & full name of author.
"author": {
action: "users.get",
params: {
fields: "username fullName"
}
},
// Custom populator handler function
"rate"(ids, docs, rule, ctx) {
return Promise.resolve(...);
}
}
}
});
// List posts with populated authors
broker.call("posts.find", { populate: ["author"]}).then(console.log);
The
populate
parameter is available infind
,list
andget
actions.
There are 3 lifecycle entity events which are called when entities are manipulated.
broker.createService({
name: "posts",
mixins: [DbService],
settings: {},
afterConnected() {
this.logger.info("Connected successfully");
},
entityCreated(json, ctx) {
this.logger.info("New entity created!");
},
entityUpdated(json, ctx) {
// You can also access to Context
this.logger.info(`Entity updated by '${ctx.meta.user.name}' user!`);
},
entityRemoved(json, ctx) {
this.logger.info("Entity removed", json);
},
});
Please note! If you manipulate multiple entities (updateMany, removeMany), the
json
parameter will be aNumber
instead of entities!
Naturally you can extend this service with your custom actions.
const DbService = require("moleculer-db");
module.exports = {
name: "posts",
mixins: [DbService],
settings: {
fields: ["_id", "title", "content", "votes"]
},
actions: {
// Increment `votes` field by post ID
vote(ctx) {
return this.adapter.updateById(ctx.params.id, { $inc: { votes: 1 } });
},
// List posts of an author
byAuthors(ctx) {
return this.find({
query: {
author: ctx.params.authorID
},
limit: ctx.params.limit || 10,
sort: "-createdAt"
});
}
}
}
According to moleculer documentation you can disable an action when override it with false
const DbService = require("moleculer-db");
module.exports = {
name: "posts",
mixins: [DbService],
actions: {
// Disable find default action
find: false
}
}
$ npm test
In development with watching
$ npm run ci
The project is available under the MIT license.
Copyright (c) 2016-2024 MoleculerJS