There is a project runner helper script in the Moleculer project. With it you don’t need to create a ServiceBroker instance with options, but a moleculer.config.js
or moleculer.config.json
file in the root of repo, fill it with your options, then call the moleculer-runner
NPM script.
Another solution is to put them into environment variables instead of putting options to file.
Production-readyIn production, we recommend putting options into the environment variables! Use the
moleculer.config.js
only during development or store only common options.
Syntax
$ moleculer-runner [options] [service files or directories or glob masks] |
Note: It runs in this format in NPM scripts only. To call it directly from your console, use the
./node_modules/.bin/moleculer-runner --repl
ornode ./node_modules/moleculer/bin/moleculer-runner.js --repl
format.
Options
Option | Type | Default | Description |
---|---|---|---|
-r , --repl |
Boolean |
false |
If true, it switches to REPL mode after broker started. |
-s , --silent |
Boolean |
false |
Disable the broker logger. It prints nothing to the console. |
-H , --hot |
Boolean |
false |
Hot reload services when they change. |
-c , --config <file> |
String |
null |
Load configuration file from a different path or a different filename. |
-e , --env |
Boolean |
false |
Load envorinment variables from the ‘.env’ file from the current folder. |
-E , --envfile <file> |
String |
null |
Load envorinment variables from the specified file. |
-i , --instances |
Number |
null |
Launch [number] node instances (with cluster module) |
Example NPM scripts
{ |
The dev
script loads development configurations from the moleculer.dev.config.js
file, start all services from the services
folder, enable hot-reloading and switches to REPL mode. Run it with the npm run dev
command.
The start
script is to load the default moleculer.config.js
file if it exists, otherwise only loads options from environment variables. Starts 4 instances of broker, then they start all services from the services
folder. Run it with npm start
command.
Configuration loading logic
The runner does the following steps to load & merge configurations:
- It loads config file defined in CLI options. If it does not exist, it throws an error.
- If not defined, it loads the
moleculer.config.js
file from the current directory. If it does not exist, it loads themoleculer.config.json
file. - Once a config file has been loaded, it merges options with the default options of the ServiceBroker.
- The runner observes the options step by step and tries to overwrite them from environment variables. Once
logLevel: "warn"
is set in the config file, but theLOGLEVEL=debug
environment variable is defined, the runner overwrites it, and it results:logLevel: "debug"
.
To overwrite broker’s deeply nested default options, which are not present in
moleculer.config.js
, via environment variables, use theMOL_
prefix and double underscore__
for nested properties in.env
file. For example, to set the cacher prefix toMOL
you should declare asMOL_CACHER__OPTIONS__PREFIX=MOL
.
Configuration file
The structure of the configuration file is the same as that of the broker options. Every property has the same name.
Example config file
module.exports = { |
Environment variables
The runner transforms the property names to uppercase. If nested, the runner concatenates names with _
.
Example environment variables
NODEID=node-test |
Services loading logic
The runner loads service files or folders defined in CLI arguments. If you define folder(s), the runner loads all services **/*.service.js
from specified one(s) (including sub-folders too). Services & service folder can be loaded with SERVICES
and SERVICEDIR
environment variables.
Loading steps:
- If
SERVICEDIR
env found, but noSERVICES
env, it loads all services from theSERVICEDIR
directory. - If
SERVICEDIR
&SERVICES
env found, it loads the specified services from theSERVICEDIR
directory. - If no
SERVICEDIR
, butSERVICES
env found, it loads the specified services from the current directory. - Check the CLI arguments. If filename found, it loads them. If directory found, it loads them. It glob pattern found, it applies and load the found files.
Please note: shorthand names can also be used in
SERVICES
env var.
Example
SERVICEDIR=services |
It loads the math.service.js
, post.service.js
and user.service.js
files from the services
folder.
SERVICEDIR=my-services |
It loads all *.service.js
files from the my-services
folder (including sub-folders too).
Glob patterns
If you want to be more specific, use glob patterns. It is useful when loading all services except certain ones.
$ moleculer-runner services !services/others/**/*.service.js services/others/mandatory/main.service.js |
Explanations:
services
- legacy mode. Load all services from theservices
folder with**/*.service.js
file mask.!services/others/**/*.service.js
- skip all services in theservices/others
folder and sub-folders.services/others/mandatory/main.service.js
- load the exact service.
The glob patterns work in the
SERVICES
enviroment variables, as well.
Built-in clustering
Moleculer Runner has a built-in clustering function to start multiple instances from your broker.
Example to start all services from the services
folder in 4 instances.
$ moleculer-runner --instances 4 services |
Clustered Node IDThe
nodeID
will be suffixed with the worker ID. E.g. if you definemy-node
nodeID in options, and starts 4 instances, the instance nodeIDs will bemy-node-1
,my-node-2
,my-node-3
,my-node-4
.
.env files
Moleculer runner can load .env
file at starting. There are two new cli options to load env file:
-e, --env
- Load envorinment variables from the ‘.env’ file from the current folder.-E, --envfile <filename>
- Load envorinment variables from the specified file.
Example
# Load the default .env file from current directory |
DependenciesTo use this feature install the
dotenv
module withnpm install dotenv --save
command.