How to extract a substring from the msg object
Published:
| by Julian Knight Reading time ~3 min.
๐ Kb
| ๐
Development
| ๐
Node-RED
Node-RED passes a msg object between node instances in a flow. It is common to need to extract a sub-string and there are multiple ways to achieve this. Here are some simeple examples.
The two main methods to use are either a โChangeโ node or a โFunctionโ node.
The examples below simply extract the first 4 characters of the msg.payload
property to illustrate the possibilities.
Change Node Examples ๐๏ธ
This is the simplest and generally the preferred approach unless you need to do a large number of changes to a msg.
Regular Expression Method ๐๏ธ
Extracting a sub-string is easily done using a regular expression which is one of the methods available to a โChange Ruleโ in the Change node.
- Change Rule Type: Change, msg.payload
- Search For:
^(.{4}).*$
- Replace With:
$1
This regex matches the whole msg.payload
string. The ()
brackets in a regular expression allow the wrapped content specification to be captured to an internal variable which we use in the replace section as $1
[{"id":"4a1695b4.85f22c","type":"inject","z":"20e74d1e.f19692","name":"","topic":"","payload":"21.300000<xml><exec>/tclrega.exe</exec><sessionId></sessionId><httpUserAgent></httpUserAgent><d>BidCos-RF.MEQ0800939:4.ACTUAL_TEMPERATURE</d></xml>","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":270,"y":100,"wires":[["235a041.55c49fc"]]},{"id":"cbbf5f80.6b42a","type":"debug","z":"20e74d1e.f19692","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":630,"y":100,"wires":[]},{"id":"235a041.55c49fc","type":"change","z":"20e74d1e.f19692","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"^(.{4}).*$","fromt":"re","to":"$1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":440,"y":100,"wires":[["cbbf5f80.6b42a"]]}]
JSONata Methods ๐๏ธ
There are several ways to use JSONata to extract a sub-string, here I illustrate a couple
$match (regular expression) ๐๏ธ
- Change Rule Type: Set, msg.payload
- To:
$match(payload, /^.{4}/)
[{"id":"61aeec2b.95a4f4","type":"change","z":"20e74d1e.f19692","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"$match(payload, /^.{4}/)\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":420,"y":160,"wires":[["9e768e8.0e2e67"]]},{"id":"ae3d0976.e0a4a8","type":"inject","z":"20e74d1e.f19692","name":"","topic":"","payload":"21.300000<xml><exec>/tclrega.exe</exec><sessionId></sessionId><httpUserAgent></httpUserAgent><d>BidCos-RF.MEQ0800939:4.ACTUAL_TEMPERATURE</d></xml>","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":270,"y":160,"wires":[["61aeec2b.95a4f4"]]},{"id":"9e768e8.0e2e67","type":"debug","z":"20e74d1e.f19692","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":630,"y":160,"wires":[]}]
$substring ๐๏ธ
- Change Rule Type: Set, msg.payload
- To:
$substring(payload, 0, 4)
[{"id":"f550ddc8.1a56f","type":"change","z":"20e74d1e.f19692","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"$substring(payload, 0, 4)\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":420,"y":220,"wires":[["835a813f.698f1"]]},{"id":"1bdcf392.de1a5c","type":"inject","z":"20e74d1e.f19692","name":"","topic":"","payload":"21.300000<xml><exec>/tclrega.exe</exec><sessionId></sessionId><httpUserAgent></httpUserAgent><d>BidCos-RF.MEQ0800939:4.ACTUAL_TEMPERATURE</d></xml>","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":270,"y":220,"wires":[["f550ddc8.1a56f"]]},{"id":"835a813f.698f1","type":"debug","z":"20e74d1e.f19692","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":630,"y":220,"wires":[]}]
Function Node Example ๐๏ธ
The Function node allows you to use JavaScript to process the msg object. You may wish to use this method if you are familiar with JavaScript and have a fairly complex processing requirement or an existing set of code.
/***
* This demonstrates a number of ways to extract
* a sub-string from the payload.
*
* Note that you don't really need an intermediate
* variable but it does make the code easier to read.
*
* Also note that I've used `const` which was
* introduced to JavaScript in ES2015 (AKA ES6).
***/
// slice is the easiest method to extract a sub-string
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice
let newStr = msg.payload.slice(0, 4);
// ---- Other possible methods ---- {
// Regular Expressions: str.match, str.exec or str.replace
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace
// str.substr - older method than slice
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr
//let newStr = msg.payload.substr(0,4)
// str.substring - older method than slice
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr
//let newStr = msg.payload.substring(0,3)
//
// The arguments of substring() represent the starting and ending indexes, while the arguments of
// substr() represent the starting index and the length of characters to include in the returned string.
// -------------------------------- }
msg.payload = newStr;
return msg;
[{"id":"da10e728.ae30d8","type":"inject","z":"20e74d1e.f19692","name":"","topic":"","payload":"21.300000<xml><exec>/tclrega.exe</exec><sessionId></sessionId><httpUserAgent></httpUserAgent><d>BidCos-RF.MEQ0800939:4.ACTUAL_TEMPERATURE</d></xml>","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":270,"y":280,"wires":[["7b9217ad.a29e58"]]},{"id":"d49e42b1.f141d","type":"debug","z":"20e74d1e.f19692","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":630,"y":280,"wires":[]},{"id":"7b9217ad.a29e58","type":"function","z":"20e74d1e.f19692","name":"","func":"/***\n * This demonstrates a number of ways to extract\n * a sub-string from the payload.\n * \n * Note that you don't really need an intermediate\n * variable but it does make the code easier to read.\n * \n * Also note that I've used `const` which was \n * introduced to JavaScript in ES2015 (AKA ES6).\n ***/\n\n// slice is the easiest method to extract a sub-string\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice\nlet newStr = msg.payload.slice(0, 4);\n\n// ---- Other possible methods ---- {\n\n// Regular Expressions: str.match, str.exec or str.replace\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace\n\n// str.substr - older method than slice\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr\n//let newStr = msg.payload.substr(0,4)\n// str.substring - older method than slice\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr\n//let newStr = msg.payload.substring(0,3)\n//\n// The arguments of substring() represent the starting and ending indexes, while the arguments of \n// substr() represent the starting index and the length of characters to include in the returned string.\n\n// -------------------------------- }\n\nmsg.payload = newStr;\n\nreturn msg;","outputs":1,"noerr":0,"x":390,"y":280,"wires":[["d49e42b1.f141d"]]}]