!Moleculer logo
moleculer-db  Moleculer service to store entities in database.
Features - 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
Install ``bash $ npm install moleculer-db --save`
Usage `js "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));
``
Settings | Property | Type | Default | Description | |-------------------|----------------------|--------------|---------------------------------------------------------------------------------------------------------------------------| | idField | String | required | Name of ID field. | | fields | Array. | 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. | 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.
Actions
Find entities by query.
$3 | Property | Type | Default | Description |
| -------- | ---- | ------- | ----------- |
| populate
| String
, Array.
| required | Populated fields. | | fields | String, Array. | 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. | required | Fields for searching. | | query | Object | - | Query object. Passes to adapter. |
$3 Type: Array.List of found entities.
count !Cached action Get count of entities by query.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | search | String | - | Search text. | | searchFields | String, Array. | required | Fields list for searching. | | query | Object | - | Query object. Passes to adapter. |
$3 Type: NumberCount of found entities.
list !Cached action List entities by filters and pagination results.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | populate | String, Array. | required | Populated fields. | | fields | String, Array. | required | Fields filter. | | page | Number | - | Page number. | | pageSize | Number | - | Size of a page. | | sort | String | - | Sorted fields. | | search | String | - | Search text. | | searchFields | String, Array. | required | Fields for searching. | | query | Object | - | Query object. Passes to adapter. |
$3 Type: ObjectList of found entities and count with pagination info.
create Create a new entity.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | params | Object | required | Entity to save. |
$3 Type: ObjectSaved entity.
insert Create many new entities.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | entity | Object | - | Entity to save. | | entities | Array. | - | Entities to save. |
$3 Type: Object, Array.Saved entity(ies).
get !Cached action Get entity by ID.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | id | any, Array. | required | ID(s) of entity. | | populate | String, Array. | required | Field list for populate. | | fields | String, Array. | required | Fields filter. | | mapping | Boolean | - | Convert the returned Array to Object where the key is the value of id. |
$3 Type: Object, Array.Found entity(ies).
update Update an entity by ID. > After update, clear the cache & call lifecycle events.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | id | any | required | ID of entity. |
$3 Type: ObjectUpdated entity.
remove Remove an entity by ID.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | id | any | required | ID of entity. |
$3 Type: NumberCount of removed entities.
Methods
sanitizeParams Sanitize context parameters at
find action.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | ctx | Context | required | | | params | Object | required | |
$3 Type: Object
getById Get entity(ies) by ID(s).
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | id | any, Array. | required | ID or IDs. | | decoding | Boolean | - | Need to decode IDs. |
$3 Type: Object, Array.Found entity(ies).
entityChanged Clear the cache & call entity lifecycle events
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | type | String | required | | | json | Object, Array., Number | required | | | ctx | Context | required | |
$3 Type: Promise
clearCache Clear cached entities
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- |No input parameters.
$3 Type: Promise
transformDocuments Transform the fetched documents
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | ctx | Context | required | | | params | Object | required | | | docs | Array, Object | required | |
$3 Type: Array, Object
validateEntity Validate an entity by validator.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | entity | Object | required | |
$3 Type: Promise
encodeID Encode ID of entity.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | id | any | required | |
$3 Type: any
decodeID Decode ID of entity.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | id | any | required | |
$3 Type: any
_find Find entities by query.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | ctx | Context | required | Context instance. | | params | Object | - | Parameters. |
$3 Type: Array.List of found entities.
_count Get count of entities by query.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | ctx | Context | required | Context instance. | | params | Object | - | Parameters. |
$3 Type: NumberCount of found entities.
_list List entities by filters and pagination results.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | ctx | Context | required | Context instance. | | params | Object | - | Parameters. |
$3 Type: ObjectList of found entities and count.
_create Create a new entity.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | ctx | Context | required | Context instance. | | params | Object | - | Parameters. |
$3 Type: ObjectSaved entity.
_insert Create many new entities.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | ctx | Context | required | Context instance. | | params | Object | - | Parameters. |
$3 Type: Object, Array.Saved entity(ies).
_get Get entity by ID.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | ctx | Context | required | Context instance. | | params | Object | - | Parameters. |
$3 Type: Object, Array.Found entity(ies).
_update Update an entity by ID. > After update, clear the cache & call lifecycle events.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | ctx | Context | required | Context instance. | | params | Object | - | Parameters. |
$3 Type: ObjectUpdated entity.
_remove Remove an entity by ID.
$3 | Property | Type | Default | Description | | -------- | ---- | ------- | ----------- | | ctx | Context | required | Context instance. | | params | Object | - | Parameters. |
Populating 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
`js 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 in find, list and get actions.
Lifecycle entity events There are 3 lifecycle entity events which are called when entities are manipulated.
`js 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 a Number instead of entities!
Extend with custom actions Naturally you can extend this service with your custom actions.
`js 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" }); } } }
`Remove default actions According to moleculer documentation you can disable an action when override it with
false
`js const DbService = require("moleculer-db");module.exports = { name: "posts", mixins: [DbService],
actions: { // Disable find default action find: false } }
`Test ` $ npm test`In development with watching
` $ npm run ci``
License The project is available under the MIT license .
Contact Copyright (c) 2016-2024 MoleculerJS 