This is a Node.js module to allow running a single Node-RED node from command-line, and pipe one to another, using a similar flow than what would be done in the Node-RED graphical interface.
Originally made in December 2019 by Alexandre Alapetite at the Alexandra Institute for the SynchroniCity European project.
License: MIT
See examples of use in node-red-contrib-json-multi-schema, node-red-contrib-chunks-to-lines, node-red-http-basic-auth.
Add an entry file index.js
(or another name) to your Node-RED node, next to a package.json
that contains a structure like { "node-red": {"node-type": "node-type.js"} }
:
const RED = require('node-red-contrib-mock-cli');
const noderedNode = RED.load(require.main);
if (noderedNode) {
//noderedNode.* //Access to the Node-RED node instance
RED.run();
} else {
console.error('Error loading Node-RED node!');
}
One can then invoke the node from command-line, passing the node type first, and then some optional node properties in JSON format:
node ./index.js node-type --firstProperty='{"Some":"JSON"}' --secondProperty='"Some text"' --thirdProperty='123'
Properties of configuration nodes can be specified using a dot such as:
node ./index.js node-type --server.url='"https://example.net/"' --server.username='"Alice"'
Replace test.js
by the name of your entry file (e.g. index.js
), and test-node
by the name of the type of your node.
printf '{"payload":3} \n {"payload":7}' | node ./test.js test-node --multiplyBy='5'
Outputs:
{"payload":15}
{"payload":35}
The command expects JSON messages with a Node-RED structure {"payload":"Example"}
from standard input, one line per message.
jq
may be used to break down and format a standard payload into a Node-RED payload:
For instance if the input is a list of observations wrapped into a JSON array:
jq -c '.[] | {"payload":.}'
The command outputs JSON messages with a Node-RED structure to standard output, one line per message.
See some examples of inputs and outputs in node-red-contrib-json-multi-schema.
Only the Node-RED JSON payload is emitted on standard-output (STDOUT), while all other messages and errors are on the standard-error (STDERR).
It is possible to catch the node events { debug
, error
, log
} to override the default behaviour (which is to write to standard-error):
noderedNode.on('debug', msg => console.warn('Caught event: ' + msg));
This module does not have the ambition of exposing the full Node-RED functionality, but instead focuses on simple cases, providing a tiny and efficient layer without any dependency. So for more advanced unit testing, and if requiring the full Node-RED is fine, then check the official node-red-node-test-helper instead of this module.