mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Merge branch 'dev' into mqtt5
This commit is contained in:
@@ -18,7 +18,7 @@
|
||||
color:"#c0edc0",
|
||||
defaults: {
|
||||
name: {value:""},
|
||||
scope: {value:[]},
|
||||
scope: {value:[], type:"*[]"},
|
||||
uncaught: {value:false}
|
||||
},
|
||||
inputs:0,
|
||||
|
@@ -30,7 +30,7 @@
|
||||
color:"#e49191",
|
||||
defaults: {
|
||||
name: {value:""},
|
||||
scope: {value:null},
|
||||
scope: {value:null, type:"*[]"},
|
||||
uncaught: {value:false}
|
||||
},
|
||||
inputs:0,
|
||||
|
@@ -26,7 +26,7 @@
|
||||
color:"#94c1d0",
|
||||
defaults: {
|
||||
name: {value:""},
|
||||
scope: {value:null}
|
||||
scope: {value:null, type:"*[]"}
|
||||
},
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
|
@@ -187,7 +187,7 @@
|
||||
color:"#ddd",//"#87D8CF",
|
||||
defaults: {
|
||||
name: {value:""},
|
||||
links: { value: [] }
|
||||
links: { value: [], type:"link out[]" }
|
||||
},
|
||||
inputs:0,
|
||||
outputs:1,
|
||||
@@ -216,7 +216,7 @@
|
||||
color:"#ddd",//"#87D8CF",
|
||||
defaults: {
|
||||
name: {value:""},
|
||||
links: { value: []}
|
||||
links: { value: [], type:"link in[]"}
|
||||
},
|
||||
align:"right",
|
||||
inputs:1,
|
||||
|
@@ -168,6 +168,10 @@ module.exports = function(RED) {
|
||||
return getFromValueType(RED.util.getMessageProperty(msg,rule.from),done);
|
||||
} else if (rule.fromt === 'flow' || rule.fromt === 'global') {
|
||||
var contextKey = RED.util.parseContextStore(rule.from);
|
||||
if (/\[msg\./.test(context.key)) {
|
||||
// The key has a nest msg. reference to evaluate first
|
||||
context.key = RED.util.normalisePropertyExpression(contextKey.key,msg,true);
|
||||
}
|
||||
node.context()[rule.fromt].get(contextKey.key, contextKey.store, (err,fromValue) => {
|
||||
if (err) {
|
||||
done(err)
|
||||
@@ -243,6 +247,10 @@ module.exports = function(RED) {
|
||||
return done(undefined,msg);
|
||||
} else if (rule.pt === 'flow' || rule.pt === 'global') {
|
||||
var contextKey = RED.util.parseContextStore(property);
|
||||
if (/\[msg/.test(contextKey.key)) {
|
||||
// The key has a nest msg. reference to evaluate first
|
||||
contextKey.key = RED.util.normalisePropertyExpression(contextKey.key, msg, true)
|
||||
}
|
||||
var target = node.context()[rule.pt];
|
||||
var callback = err => {
|
||||
if (err) {
|
||||
|
@@ -80,10 +80,10 @@ module.exports = function(RED) {
|
||||
this.drop = n.drop;
|
||||
var node = this;
|
||||
|
||||
function ourTimeout(handler, delay) {
|
||||
function ourTimeout(handler, delay, clearHandler) {
|
||||
var toutID = setTimeout(handler, delay);
|
||||
return {
|
||||
clear: function() { clearTimeout(toutID); },
|
||||
clear: function() { clearTimeout(toutID); clearHandler(); },
|
||||
trigger: function() { clearTimeout(toutID); return handler(); }
|
||||
};
|
||||
}
|
||||
@@ -113,14 +113,15 @@ module.exports = function(RED) {
|
||||
}
|
||||
|
||||
if (node.pauseType === "delay") {
|
||||
node.on("input", function(msg) {
|
||||
if (msg.hasOwnProperty("flush")) { flushDelayList(); }
|
||||
node.on("input", function(msg, send, done) {
|
||||
if (msg.hasOwnProperty("flush")) { flushDelayList(); done(); }
|
||||
else {
|
||||
var id = ourTimeout(function() {
|
||||
node.idList.splice(node.idList.indexOf(id),1);
|
||||
if (node.idList.length === 0) { node.status({}); }
|
||||
node.send(msg);
|
||||
}, node.timeout);
|
||||
send(msg);
|
||||
done();
|
||||
}, node.timeout, () => done());
|
||||
node.idList.push(id);
|
||||
if ((node.timeout > 1000) && (node.idList.length !== 0)) {
|
||||
node.status({fill:"blue",shape:"dot",text:" "});
|
||||
@@ -131,7 +132,7 @@ module.exports = function(RED) {
|
||||
node.on("close", function() { clearDelayList(); });
|
||||
}
|
||||
else if (node.pauseType === "delayv") {
|
||||
node.on("input", function(msg) {
|
||||
node.on("input", function(msg, send, done) {
|
||||
var delayvar = Number(node.timeout);
|
||||
if (msg.hasOwnProperty("delay") && !isNaN(parseFloat(msg.delay))) {
|
||||
delayvar = parseFloat(msg.delay);
|
||||
@@ -140,8 +141,9 @@ module.exports = function(RED) {
|
||||
var id = ourTimeout(function() {
|
||||
node.idList.splice(node.idList.indexOf(id),1);
|
||||
if (node.idList.length === 0) { node.status({}); }
|
||||
node.send(msg);
|
||||
}, delayvar);
|
||||
send(msg);
|
||||
done();
|
||||
}, delayvar, () => done());
|
||||
node.idList.push(id);
|
||||
if ((delayvar >= 0) && (node.idList.length !== 0)) {
|
||||
node.status({fill:"blue",shape:"dot",text:delayvar/1000+"s"});
|
||||
@@ -152,7 +154,7 @@ module.exports = function(RED) {
|
||||
node.on("close", function() { clearDelayList(); });
|
||||
}
|
||||
else if (node.pauseType === "rate") {
|
||||
node.on("input", function(msg) {
|
||||
node.on("input", function(msg, send, done) {
|
||||
if (msg.hasOwnProperty("reset")) {
|
||||
if (node.intervalID !== -1 ) {
|
||||
clearInterval(node.intervalID);
|
||||
@@ -161,17 +163,18 @@ module.exports = function(RED) {
|
||||
delete node.lastSent;
|
||||
node.buffer = [];
|
||||
node.status({text:"reset"});
|
||||
done();
|
||||
return;
|
||||
}
|
||||
if (!node.drop) {
|
||||
var m = RED.util.cloneMessage(msg);
|
||||
delete m.flush;
|
||||
if (node.intervalID !== -1) {
|
||||
node.buffer.push(m);
|
||||
node.buffer.push({msg: m, send: send, done: done});
|
||||
node.reportDepth();
|
||||
}
|
||||
else {
|
||||
node.send(m);
|
||||
send(m);
|
||||
node.reportDepth();
|
||||
node.intervalID = setInterval(function() {
|
||||
if (node.buffer.length === 0) {
|
||||
@@ -179,16 +182,22 @@ module.exports = function(RED) {
|
||||
node.intervalID = -1;
|
||||
}
|
||||
if (node.buffer.length > 0) {
|
||||
node.send(node.buffer.shift());
|
||||
const msgInfo = node.buffer.shift();
|
||||
msgInfo.send(msgInfo.msg);
|
||||
msgInfo.done();
|
||||
}
|
||||
node.reportDepth();
|
||||
}, node.rate);
|
||||
done();
|
||||
}
|
||||
if (msg.hasOwnProperty("flush")) {
|
||||
while (node.buffer.length > 0) {
|
||||
node.send(node.buffer.shift());
|
||||
const msgInfo = node.buffer.shift();
|
||||
msgInfo.send(msgInfo.msg);
|
||||
msgInfo.done();
|
||||
}
|
||||
node.status({});
|
||||
done();
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -198,17 +207,19 @@ module.exports = function(RED) {
|
||||
}
|
||||
if (!node.lastSent) { // ensuring that we always send the first message
|
||||
node.lastSent = process.hrtime();
|
||||
node.send(msg);
|
||||
send(msg);
|
||||
}
|
||||
else if ( ( (timeSinceLast[0] * SECONDS_TO_NANOS) + timeSinceLast[1] ) > (node.rate * MILLIS_TO_NANOS) ) {
|
||||
node.lastSent = process.hrtime();
|
||||
node.send(msg);
|
||||
send(msg);
|
||||
}
|
||||
done();
|
||||
}
|
||||
});
|
||||
node.on("close", function() {
|
||||
clearInterval(node.intervalID);
|
||||
clearTimeout(node.busy);
|
||||
node.buffer.forEach((msgInfo) => msgInfo.done());
|
||||
node.buffer = [];
|
||||
node.status({});
|
||||
});
|
||||
@@ -217,57 +228,75 @@ module.exports = function(RED) {
|
||||
node.intervalID = setInterval(function() {
|
||||
if (node.pauseType === "queue") {
|
||||
if (node.buffer.length > 0) {
|
||||
node.send(node.buffer.shift()); // send the first on the queue
|
||||
const msgInfo = node.buffer.shift();
|
||||
msgInfo.send(msgInfo.msg); // send the first on the queue
|
||||
msgInfo.done();
|
||||
}
|
||||
}
|
||||
else {
|
||||
while (node.buffer.length > 0) { // send the whole queue
|
||||
node.send(node.buffer.shift());
|
||||
const msgInfo = node.buffer.shift();
|
||||
msgInfo.send(msgInfo.msg);
|
||||
msgInfo.done();
|
||||
}
|
||||
}
|
||||
node.reportDepth();
|
||||
},node.rate);
|
||||
|
||||
var hit;
|
||||
node.on("input", function(msg) {
|
||||
node.on("input", function(msg, send, done) {
|
||||
if (!msg.hasOwnProperty("topic")) { msg.topic = "_none_"; }
|
||||
hit = false;
|
||||
for (var b in node.buffer) { // check if already in queue
|
||||
if (msg.topic === node.buffer[b].topic) {
|
||||
node.buffer[b] = msg; // if so - replace existing entry
|
||||
if (msg.topic === node.buffer[b].msg.topic) {
|
||||
node.buffer[b].done();
|
||||
node.buffer[b] = {msg, send, done}; // if so - replace existing entry
|
||||
hit = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!hit) {
|
||||
node.buffer.push(msg); // if not add to end of queue
|
||||
node.buffer.push({msg, send, done}); // if not add to end of queue
|
||||
node.reportDepth();
|
||||
}
|
||||
if (msg.hasOwnProperty("reset")) {
|
||||
while (node.buffer.length > 0) {
|
||||
const msgInfo = node.buffer.shift();
|
||||
msgInfo.done();
|
||||
}
|
||||
node.buffer = [];
|
||||
node.status({text:"reset"});
|
||||
done();
|
||||
}
|
||||
if (msg.hasOwnProperty("flush")) {
|
||||
while (node.buffer.length > 0) {
|
||||
node.send(node.buffer.shift());
|
||||
const msgInfo = node.buffer.shift();
|
||||
msgInfo.send(msgInfo.msg);
|
||||
msgInfo.done();
|
||||
}
|
||||
node.status({});
|
||||
done();
|
||||
}
|
||||
});
|
||||
node.on("close", function() {
|
||||
clearInterval(node.intervalID);
|
||||
while (node.buffer.length > 0) {
|
||||
const msgInfo = node.buffer.shift();
|
||||
msgInfo.done();
|
||||
}
|
||||
node.buffer = [];
|
||||
node.status({});
|
||||
});
|
||||
}
|
||||
else if (node.pauseType === "random") {
|
||||
node.on("input", function(msg) {
|
||||
node.on("input", function(msg, send, done) {
|
||||
var wait = node.randomFirst + (node.diff * Math.random());
|
||||
var id = ourTimeout(function() {
|
||||
node.idList.splice(node.idList.indexOf(id),1);
|
||||
node.send(msg);
|
||||
send(msg);
|
||||
node.status({});
|
||||
}, wait);
|
||||
done();
|
||||
}, wait, () => done());
|
||||
node.idList.push(id);
|
||||
if ((node.timeout >= 1000) && (node.idList.length !== 0)) {
|
||||
node.status({fill:"blue",shape:"dot",text:parseInt(wait/10)/100+"s"});
|
||||
|
@@ -82,10 +82,10 @@ module.exports = function(RED) {
|
||||
var npay = {};
|
||||
var pendingMessages = [];
|
||||
var activeMessagePromise = null;
|
||||
var processMessageQueue = function(msg) {
|
||||
if (msg) {
|
||||
var processMessageQueue = function(msgInfo) {
|
||||
if (msgInfo) {
|
||||
// A new message has arrived - add it to the message queue
|
||||
pendingMessages.push(msg);
|
||||
pendingMessages.push(msgInfo);
|
||||
if (activeMessagePromise !== null) {
|
||||
// The node is currently processing a message, so do nothing
|
||||
// more with this message
|
||||
@@ -101,17 +101,17 @@ module.exports = function(RED) {
|
||||
|
||||
// There are more messages to process. Get the next message and
|
||||
// start processing it. Recurse back in to check for any more
|
||||
var nextMsg = pendingMessages.shift();
|
||||
activeMessagePromise = processMessage(nextMsg)
|
||||
var nextMsgInfo = pendingMessages.shift();
|
||||
activeMessagePromise = processMessage(nextMsgInfo)
|
||||
.then(processMessageQueue)
|
||||
.catch((err) => {
|
||||
node.error(err,nextMsg);
|
||||
nextMsgInfo.done(err);
|
||||
return processMessageQueue();
|
||||
});
|
||||
}
|
||||
|
||||
this.on('input', function(msg) {
|
||||
processMessageQueue(msg);
|
||||
this.on('input', function(msg, send, done) {
|
||||
processMessageQueue({msg, send, done});
|
||||
});
|
||||
|
||||
var stat = function() {
|
||||
@@ -121,7 +121,8 @@ module.exports = function(RED) {
|
||||
else return {fill:"blue",shape:"dot",text:l};
|
||||
}
|
||||
|
||||
var processMessage = function(msg) {
|
||||
var processMessage = function(msgInfo) {
|
||||
let msg = msgInfo.msg;
|
||||
var topic = RED.util.getMessageProperty(msg,node.topic) || "_none";
|
||||
var promise;
|
||||
var delayDuration = node.duration;
|
||||
@@ -179,7 +180,10 @@ module.exports = function(RED) {
|
||||
/* istanbul ignore else */
|
||||
if (node.op1type !== "nul") {
|
||||
var msg2 = RED.util.cloneMessage(msg);
|
||||
node.topics[topic].tout = setInterval(function() { node.send(RED.util.cloneMessage(msg2)); }, delayDuration);
|
||||
node.topics[topic].tout = setInterval(function() {
|
||||
if (node.op1type === "date") { msg2.payload = Date.now(); }
|
||||
msgInfo.send(RED.util.cloneMessage(msg2));
|
||||
}, delayDuration);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -203,14 +207,15 @@ module.exports = function(RED) {
|
||||
}
|
||||
promise.then(() => {
|
||||
if (node.op2type === "payl") {
|
||||
if (node.second === true) { node.send([null,npay[topic]]); }
|
||||
else { node.send(npay[topic]); }
|
||||
if (node.second === true) { msgInfo.send([null,npay[topic]]); }
|
||||
else { msgInfo.send(npay[topic]); }
|
||||
delete npay[topic];
|
||||
}
|
||||
else {
|
||||
msg2.payload = node.topics[topic].m2;
|
||||
if (node.second === true) { node.send([null,msg2]); }
|
||||
else { node.send(msg2); }
|
||||
if (node.op2type === "date") { msg2.payload = Date.now(); }
|
||||
if (node.second === true) { msgInfo.send([null,msg2]); }
|
||||
else { msgInfo.send(msg2); }
|
||||
}
|
||||
delete node.topics[topic];
|
||||
node.status(stat());
|
||||
@@ -225,8 +230,9 @@ module.exports = function(RED) {
|
||||
}, delayDuration);
|
||||
}
|
||||
}
|
||||
msgInfo.done();
|
||||
node.status(stat());
|
||||
if (node.op1type !== "nul") { node.send(RED.util.cloneMessage(msg)); }
|
||||
if (node.op1type !== "nul") { msgInfo.send(RED.util.cloneMessage(msg)); }
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -262,8 +268,8 @@ module.exports = function(RED) {
|
||||
}
|
||||
delete node.topics[topic];
|
||||
node.status(stat());
|
||||
if (node.second === true) { node.send([null,msg2]); }
|
||||
else { node.send(msg2); }
|
||||
if (node.second === true) { msgInfo.send([null,msg2]); }
|
||||
else { msgInfo.send(msg2); }
|
||||
}).catch(err => {
|
||||
node.error(err);
|
||||
});
|
||||
@@ -273,6 +279,7 @@ module.exports = function(RED) {
|
||||
// if (node.op2type === "payl") {node.topics[topic].m2 = RED.util.cloneMessage(msg.payload); }
|
||||
// }
|
||||
}
|
||||
msgInfo.done();
|
||||
return Promise.resolve();
|
||||
}
|
||||
this.on("close", function() {
|
||||
|
@@ -52,7 +52,7 @@
|
||||
color:"darksalmon",
|
||||
defaults: {
|
||||
command: {value:""},
|
||||
addpay: {value:true},
|
||||
addpay: {value:false},
|
||||
append: {value:""},
|
||||
useSpawn: {value:"false"},
|
||||
timer: {value:""},
|
||||
|
@@ -31,12 +31,12 @@ module.exports = function(RED) {
|
||||
this.timer = Number(n.timer || 0)*1000;
|
||||
this.activeProcesses = {};
|
||||
this.oldrc = (n.oldrc || false).toString();
|
||||
this.execOpt = {encoding:'binary', maxBuffer:10000000};
|
||||
this.execOpt = {encoding:'binary', maxBuffer:RED.settings.execMaxBufferSize||10000000};
|
||||
var node = this;
|
||||
|
||||
if (process.platform === 'linux' && fs.existsSync('/bin/bash')) { node.execOpt.shell = '/bin/bash'; }
|
||||
|
||||
var cleanup = function(p) {
|
||||
if (process.platform === 'linux' && fs.existsSync('/bin/bash')) { node.execOpt.shell = '/bin/bash'; }
|
||||
|
||||
var cleanup = function(p) {
|
||||
node.activeProcesses[p].kill();
|
||||
//node.status({fill:"red",shape:"dot",text:"timeout"});
|
||||
//node.error("Exec node timeout");
|
||||
|
@@ -210,7 +210,7 @@ module.exports = function(RED) {
|
||||
var httpMiddleware = function(req,res,next) { next(); }
|
||||
|
||||
if (RED.settings.httpNodeMiddleware) {
|
||||
if (typeof RED.settings.httpNodeMiddleware === "function") {
|
||||
if (typeof RED.settings.httpNodeMiddleware === "function" || Array.isArray(RED.settings.httpNodeMiddleware)) {
|
||||
httpMiddleware = RED.settings.httpNodeMiddleware;
|
||||
}
|
||||
}
|
||||
|
@@ -235,6 +235,7 @@
|
||||
oneditprepare: function() {
|
||||
var previous = null;
|
||||
$("#node-input-out").on('focus', function () { previous = this.value; }).on("change", function() {
|
||||
$("#node-input-splitc").show();
|
||||
if (previous === null) { previous = $("#node-input-out").val(); }
|
||||
if ($("#node-input-out").val() == "char") {
|
||||
if (previous != "char") { $("#node-input-splitc").val("\\n"); }
|
||||
@@ -247,6 +248,7 @@
|
||||
else if ($("#node-input-out").val() == "immed") {
|
||||
if (previous != "immed") { $("#node-input-splitc").val(" "); }
|
||||
$("#node-units").text("");
|
||||
$("#node-input-splitc").hide();
|
||||
}
|
||||
else if ($("#node-input-out").val() == "count") {
|
||||
if (previous != "count") { $("#node-input-splitc").val("12"); }
|
||||
@@ -255,6 +257,7 @@
|
||||
else {
|
||||
if (previous != "sit") { $("#node-input-splitc").val(" "); }
|
||||
$("#node-units").text("");
|
||||
$("#node-input-splitc").hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@@ -18,7 +18,7 @@ module.exports = function(RED) {
|
||||
"use strict";
|
||||
function CSVNode(n) {
|
||||
RED.nodes.createNode(this,n);
|
||||
this.template = (n.temp || "").split(",");
|
||||
this.template = (n.temp || "");
|
||||
this.sep = (n.sep || ',').replace("\\t","\t").replace("\\n","\n").replace("\\r","\r");
|
||||
this.quo = '"';
|
||||
this.ret = (n.ret || "\n").replace("\\n","\n").replace("\\r","\r");
|
||||
@@ -38,16 +38,12 @@ module.exports = function(RED) {
|
||||
if (this.hdrout === true) { this.hdrout = "all"; }
|
||||
var tmpwarn = true;
|
||||
var node = this;
|
||||
var re = new RegExp(',(?=(?:(?:[^"]*"){2})*[^"]*$)','g');
|
||||
|
||||
// pass in an array of column names to be trimed, de-quoted and retrimed
|
||||
var clean = function(col) {
|
||||
for (var t = 0; t < col.length; t++) {
|
||||
col[t] = col[t].trim(); // remove leading and trailing whitespace
|
||||
if (col[t].charAt(0) === '"' && col[t].charAt(col[t].length -1) === '"') {
|
||||
// remove leading and trailing quotes (if they exist) - and remove whitepace again.
|
||||
col[t] = col[t].substr(1,col[t].length -2).trim();
|
||||
}
|
||||
}
|
||||
col = col.trim().split(re) || [""];
|
||||
col = col.map(x => x.replace(/"/g,'').trim());
|
||||
if ((col.length === 1) && (col[0] === "")) { node.goodtmpl = false; }
|
||||
else { node.goodtmpl = true; }
|
||||
return col;
|
||||
@@ -55,7 +51,7 @@ module.exports = function(RED) {
|
||||
node.template = clean(node.template);
|
||||
node.hdrSent = false;
|
||||
|
||||
this.on("input", function(msg) {
|
||||
this.on("input", function(msg, send, done) {
|
||||
if (msg.hasOwnProperty("reset")) {
|
||||
node.hdrSent = false;
|
||||
}
|
||||
@@ -67,13 +63,14 @@ module.exports = function(RED) {
|
||||
if (node.hdrout !== "none" && node.hdrSent === false) {
|
||||
if ((node.template.length === 1) && (node.template[0] === '')) {
|
||||
if (msg.hasOwnProperty("columns")) {
|
||||
node.template = clean((msg.columns || "").split(","));
|
||||
node.template = clean(msg.columns || "");
|
||||
}
|
||||
else {
|
||||
node.template = Object.keys(msg.payload[0]);
|
||||
}
|
||||
}
|
||||
ou += node.template.join(node.sep) + node.ret;
|
||||
// ou += node.template.join(node.sep) + node.ret;
|
||||
ou += node.template.map(v => v.indexOf(node.sep)!==-1 ? '"'+v+'"' : v).join(node.sep) + node.ret;
|
||||
if (node.hdrout === "once") { node.hdrSent = true; }
|
||||
}
|
||||
for (var s = 0; s < msg.payload.length; s++) {
|
||||
@@ -93,7 +90,7 @@ module.exports = function(RED) {
|
||||
}
|
||||
else {
|
||||
if ((node.template.length === 1) && (node.template[0] === '') && (msg.hasOwnProperty("columns"))) {
|
||||
node.template = clean((msg.columns || "").split(","));
|
||||
node.template = clean(msg.columns || "")//.split(","));
|
||||
}
|
||||
if ((node.template.length === 1) && (node.template[0] === '')) {
|
||||
/* istanbul ignore else */
|
||||
@@ -144,10 +141,11 @@ module.exports = function(RED) {
|
||||
}
|
||||
}
|
||||
msg.payload = ou;
|
||||
msg.columns = node.template.join(',');
|
||||
if (msg.payload !== '') { node.send(msg); }
|
||||
msg.columns = node.template.map(v => v.indexOf(',')!==-1 ? '"'+v+'"' : v).join(',');
|
||||
if (msg.payload !== '') { send(msg); }
|
||||
done();
|
||||
}
|
||||
catch(e) { node.error(e,msg); }
|
||||
catch(e) { done(e); }
|
||||
}
|
||||
else if (typeof msg.payload == "string") { // convert CSV string to object
|
||||
try {
|
||||
@@ -178,7 +176,7 @@ module.exports = function(RED) {
|
||||
if ((node.hdrin === true) && first) { // if the template is in the first line
|
||||
if ((line[i] === "\n")||(line[i] === "\r")||(line.length - i === 1)) { // look for first line break
|
||||
if (line.length - i === 1) { tmp += line[i]; }
|
||||
node.template = clean(tmp.split(node.sep));
|
||||
node.template = clean(tmp);
|
||||
first = false;
|
||||
}
|
||||
else { tmp += line[i]; }
|
||||
@@ -254,22 +252,22 @@ module.exports = function(RED) {
|
||||
}
|
||||
if (msg.parts.index + 1 === msg.parts.count) {
|
||||
msg.payload = node.store;
|
||||
msg.columns = node.template.filter(val => val).join(',');
|
||||
msg.columns = node.template.map(v => v.indexOf(',')!==-1 ? '"'+v+'"' : v).filter(v => v).join(',');
|
||||
delete msg.parts;
|
||||
node.send(msg);
|
||||
send(msg);
|
||||
node.store = [];
|
||||
}
|
||||
}
|
||||
else {
|
||||
msg.columns = node.template.filter(val => val).join(',');
|
||||
node.send(msg); // finally send the array
|
||||
msg.columns = node.template.map(v => v.indexOf(',')!==-1 ? '"'+v+'"' : v).filter(v => v).join(',');
|
||||
send(msg); // finally send the array
|
||||
}
|
||||
}
|
||||
else {
|
||||
var len = a.length;
|
||||
for (var i = 0; i < len; i++) {
|
||||
var newMessage = RED.util.cloneMessage(msg);
|
||||
newMessage.columns = node.template.filter(val => val).join(',');
|
||||
newMessage.columns = node.template.map(v => v.indexOf(',')!==-1 ? '"'+v+'"' : v).filter(v => v).join(',');
|
||||
newMessage.payload = a[i];
|
||||
if (!has_parts) {
|
||||
newMessage.parts = {
|
||||
@@ -286,19 +284,21 @@ module.exports = function(RED) {
|
||||
newMessage.parts.count -= 1;
|
||||
}
|
||||
}
|
||||
node.send(newMessage);
|
||||
send(newMessage);
|
||||
}
|
||||
}
|
||||
node.linecount = 0;
|
||||
done();
|
||||
}
|
||||
catch(e) { node.error(e,msg); }
|
||||
catch(e) { done(e); }
|
||||
}
|
||||
else { node.warn(RED._("csv.errors.csv_js")); }
|
||||
else { node.warn(RED._("csv.errors.csv_js")); done(); }
|
||||
}
|
||||
else {
|
||||
if (!msg.hasOwnProperty("reset")) {
|
||||
node.send(msg); // If no payload and not reset - just pass it on.
|
||||
send(msg); // If no payload and not reset - just pass it on.
|
||||
}
|
||||
done();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@@ -17,18 +17,18 @@
|
||||
module.exports = function(RED) {
|
||||
"use strict";
|
||||
|
||||
function sendArray(node,msg,array) {
|
||||
function sendArray(node,msg,array,send) {
|
||||
for (var i = 0; i < array.length-1; i++) {
|
||||
msg.payload = array[i];
|
||||
msg.parts.index = node.c++;
|
||||
if (node.stream !== true) { msg.parts.count = array.length; }
|
||||
node.send(RED.util.cloneMessage(msg));
|
||||
send(RED.util.cloneMessage(msg));
|
||||
}
|
||||
if (node.stream !== true) {
|
||||
msg.payload = array[i];
|
||||
msg.parts.index = node.c++;
|
||||
msg.parts.count = array.length;
|
||||
node.send(RED.util.cloneMessage(msg));
|
||||
send(RED.util.cloneMessage(msg));
|
||||
node.c = 0;
|
||||
}
|
||||
else { node.remainder = array[i]; }
|
||||
@@ -67,7 +67,8 @@ module.exports = function(RED) {
|
||||
}
|
||||
node.c = 0;
|
||||
node.buffer = Buffer.from([]);
|
||||
this.on("input", function(msg) {
|
||||
node.pendingDones = [];
|
||||
this.on("input", function(msg, send, done) {
|
||||
if (msg.hasOwnProperty("payload")) {
|
||||
if (msg.hasOwnProperty("parts")) { msg.parts = { parts:msg.parts }; } // push existing parts to a stack
|
||||
else { msg.parts = {}; }
|
||||
@@ -93,14 +94,23 @@ module.exports = function(RED) {
|
||||
msg.payload = data.substring(pos,pos+node.splt);
|
||||
msg.parts.index = node.c++;
|
||||
pos += node.splt;
|
||||
node.send(RED.util.cloneMessage(msg));
|
||||
send(RED.util.cloneMessage(msg));
|
||||
}
|
||||
if (count > 1) {
|
||||
node.pendingDones.forEach(d => d());
|
||||
node.pendingDones = [];
|
||||
}
|
||||
node.remainder = data.substring(pos);
|
||||
if ((node.stream !== true) || (node.remainder.length === node.splt)) {
|
||||
msg.payload = node.remainder;
|
||||
msg.parts.index = node.c++;
|
||||
node.send(RED.util.cloneMessage(msg));
|
||||
send(RED.util.cloneMessage(msg));
|
||||
node.pendingDones.forEach(d => d());
|
||||
node.pendingDones = [];
|
||||
done();
|
||||
node.remainder = "";
|
||||
} else {
|
||||
node.pendingDones.push(done);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -115,7 +125,8 @@ module.exports = function(RED) {
|
||||
a = msg.payload.split(node.splt);
|
||||
msg.parts.ch = node.splt; // pass the split char to other end for rejoin
|
||||
}
|
||||
sendArray(node,msg,a);
|
||||
sendArray(node,msg,a,send);
|
||||
done();
|
||||
}
|
||||
}
|
||||
else if (Array.isArray(msg.payload)) { // then split array into messages
|
||||
@@ -135,8 +146,9 @@ module.exports = function(RED) {
|
||||
}
|
||||
msg.parts.index = i;
|
||||
pos += node.arraySplt;
|
||||
node.send(RED.util.cloneMessage(msg));
|
||||
send(RED.util.cloneMessage(msg));
|
||||
}
|
||||
done();
|
||||
}
|
||||
else if ((typeof msg.payload === "object") && !Buffer.isBuffer(msg.payload)) {
|
||||
var j = 0;
|
||||
@@ -152,10 +164,11 @@ module.exports = function(RED) {
|
||||
msg.parts.key = p;
|
||||
msg.parts.index = j;
|
||||
msg.parts.count = l;
|
||||
node.send(RED.util.cloneMessage(msg));
|
||||
send(RED.util.cloneMessage(msg));
|
||||
j += 1;
|
||||
}
|
||||
}
|
||||
done();
|
||||
}
|
||||
else if (Buffer.isBuffer(msg.payload)) {
|
||||
var len = node.buffer.length + msg.payload.length;
|
||||
@@ -176,14 +189,23 @@ module.exports = function(RED) {
|
||||
msg.payload = buff.slice(pos,pos+node.splt);
|
||||
msg.parts.index = node.c++;
|
||||
pos += node.splt;
|
||||
node.send(RED.util.cloneMessage(msg));
|
||||
send(RED.util.cloneMessage(msg));
|
||||
}
|
||||
if (count > 1) {
|
||||
node.pendingDones.forEach(d => d());
|
||||
node.pendingDones = [];
|
||||
}
|
||||
node.buffer = buff.slice(pos);
|
||||
if ((node.stream !== true) || (node.buffer.length === node.splt)) {
|
||||
msg.payload = node.buffer;
|
||||
msg.parts.index = node.c++;
|
||||
node.send(RED.util.cloneMessage(msg));
|
||||
send(RED.util.cloneMessage(msg));
|
||||
node.pendingDones.forEach(d => d());
|
||||
node.pendingDones = [];
|
||||
done();
|
||||
node.buffer = Buffer.from([]);
|
||||
} else {
|
||||
node.pendingDones.push(done);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -210,23 +232,34 @@ module.exports = function(RED) {
|
||||
while (pos > -1) {
|
||||
msg.payload = buff.slice(p,pos);
|
||||
msg.parts.index = node.c++;
|
||||
node.send(RED.util.cloneMessage(msg));
|
||||
send(RED.util.cloneMessage(msg));
|
||||
i++;
|
||||
p = pos+node.splt.length;
|
||||
pos = buff.indexOf(node.splt,p);
|
||||
}
|
||||
if (count > 1) {
|
||||
node.pendingDones.forEach(d => d());
|
||||
node.pendingDones = [];
|
||||
}
|
||||
if ((node.stream !== true) && (p < buff.length)) {
|
||||
msg.payload = buff.slice(p,buff.length);
|
||||
msg.parts.index = node.c++;
|
||||
msg.parts.count = node.c++;
|
||||
node.send(RED.util.cloneMessage(msg));
|
||||
send(RED.util.cloneMessage(msg));
|
||||
node.pendingDones.forEach(d => d());
|
||||
node.pendingDones = [];
|
||||
}
|
||||
else {
|
||||
node.buffer = buff.slice(p,buff.length);
|
||||
node.pendingDones.push(done);
|
||||
}
|
||||
if (node.buffer.length == 0) {
|
||||
done();
|
||||
}
|
||||
}
|
||||
}
|
||||
//else { } // otherwise drop the message.
|
||||
} else { // otherwise drop the message.
|
||||
done();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -264,16 +297,16 @@ module.exports = function(RED) {
|
||||
}
|
||||
|
||||
|
||||
function reduceMessageGroup(node,msgs,exp,fixup,count,accumulator,done) {
|
||||
var msg = msgs.shift();
|
||||
exp.assign("I", msg.parts.index);
|
||||
function reduceMessageGroup(node,msgInfos,exp,fixup,count,accumulator,done) {
|
||||
var msgInfo = msgInfos.shift();
|
||||
exp.assign("I", msgInfo.msg.parts.index);
|
||||
exp.assign("N", count);
|
||||
exp.assign("A", accumulator);
|
||||
RED.util.evaluateJSONataExpression(exp, msg, (err,result) => {
|
||||
RED.util.evaluateJSONataExpression(exp, msgInfo.msg, (err,result) => {
|
||||
if (err) {
|
||||
return done(err);
|
||||
}
|
||||
if (msgs.length === 0) {
|
||||
if (msgInfos.length === 0) {
|
||||
if (fixup) {
|
||||
fixup.assign("N", count);
|
||||
fixup.assign("A", result);
|
||||
@@ -281,39 +314,43 @@ module.exports = function(RED) {
|
||||
if (err) {
|
||||
return done(err);
|
||||
}
|
||||
node.send({payload: result});
|
||||
msgInfo.send({payload: result});
|
||||
done();
|
||||
});
|
||||
} else {
|
||||
node.send({payload: result});
|
||||
msgInfo.send({payload: result});
|
||||
done();
|
||||
}
|
||||
} else {
|
||||
reduceMessageGroup(node,msgs,exp,fixup,count,result,done);
|
||||
reduceMessageGroup(node,msgInfos,exp,fixup,count,result,done);
|
||||
}
|
||||
});
|
||||
}
|
||||
function reduceAndSendGroup(node, group, done) {
|
||||
var is_right = node.reduce_right;
|
||||
var flag = is_right ? -1 : 1;
|
||||
var msgs = group.msgs;
|
||||
var msgInfos = group.msgs;
|
||||
const preservedMsgInfos = [...msgInfos];
|
||||
try {
|
||||
RED.util.evaluateNodeProperty(node.exp_init, node.exp_init_type, node, {}, (err,accum) => {
|
||||
var reduceExpression = node.reduceExpression;
|
||||
var fixupExpression = node.fixupExpression;
|
||||
var count = group.count;
|
||||
msgs.sort(function(x,y) {
|
||||
var ix = x.parts.index;
|
||||
var iy = y.parts.index;
|
||||
msgInfos.sort(function(x,y) {
|
||||
var ix = x.msg.parts.index;
|
||||
var iy = y.msg.parts.index;
|
||||
if (ix < iy) {return -flag;}
|
||||
if (ix > iy) {return flag;}
|
||||
return 0;
|
||||
});
|
||||
reduceMessageGroup(node, msgs,reduceExpression,fixupExpression,count,accum,(err,result) => {
|
||||
reduceMessageGroup(node, msgInfos,reduceExpression,fixupExpression,count,accum,(err,result) => {
|
||||
if (err) {
|
||||
preservedMsgInfos.pop(); // omit last message to emit error message
|
||||
preservedMsgInfos.forEach(mInfo => mInfo.done());
|
||||
done(err);
|
||||
return;
|
||||
} else {
|
||||
preservedMsgInfos.forEach(mInfo => mInfo.done());
|
||||
done();
|
||||
}
|
||||
})
|
||||
@@ -323,7 +360,8 @@ module.exports = function(RED) {
|
||||
}
|
||||
}
|
||||
|
||||
function reduceMessage(node, msg, done) {
|
||||
function reduceMessage(node, msgInfo, done) {
|
||||
let msg = msgInfo.msg;
|
||||
if (msg.hasOwnProperty('parts')) {
|
||||
var parts = msg.parts;
|
||||
var pending = node.pending;
|
||||
@@ -344,7 +382,7 @@ module.exports = function(RED) {
|
||||
if (parts.hasOwnProperty('count') && (group.count === undefined)) {
|
||||
group.count = parts.count;
|
||||
}
|
||||
msgs.push(msg);
|
||||
msgs.push(msgInfo);
|
||||
pending_count++;
|
||||
var completeProcess = function(err) {
|
||||
if (err) {
|
||||
@@ -353,6 +391,13 @@ module.exports = function(RED) {
|
||||
node.pending_count = pending_count;
|
||||
var max_msgs = maxKeptMsgsCount(node);
|
||||
if ((max_msgs > 0) && (pending_count > max_msgs)) {
|
||||
Object.values(node.pending).forEach(group => {
|
||||
group.msgs.forEach(mInfo => {
|
||||
if (mInfo.msg._msgid !== msgInfo.msg._msgid) {
|
||||
mInfo.done();
|
||||
}
|
||||
});
|
||||
});
|
||||
node.pending = {};
|
||||
node.pending_count = 0;
|
||||
done(RED._("join.too-many"));
|
||||
@@ -368,7 +413,8 @@ module.exports = function(RED) {
|
||||
completeProcess();
|
||||
}
|
||||
} else {
|
||||
node.send(msg);
|
||||
msgInfo.send(msg);
|
||||
msgInfo.done();
|
||||
done();
|
||||
}
|
||||
}
|
||||
@@ -480,7 +526,9 @@ module.exports = function(RED) {
|
||||
delete group.msg.parts;
|
||||
}
|
||||
delete group.msg.complete;
|
||||
node.send(RED.util.cloneMessage(group.msg));
|
||||
group.send(RED.util.cloneMessage(group.msg));
|
||||
group.dones.forEach(f => f());
|
||||
group.dones = [];
|
||||
}
|
||||
|
||||
var pendingMessages = [];
|
||||
@@ -489,10 +537,10 @@ module.exports = function(RED) {
|
||||
// groups may overlap and cause unexpected results. The use of JSONata
|
||||
// means some async processing *might* occur if flow/global context is
|
||||
// accessed.
|
||||
var processReduceMessageQueue = function(msg) {
|
||||
if (msg) {
|
||||
var processReduceMessageQueue = function(msgInfo) {
|
||||
if (msgInfo) {
|
||||
// A new message has arrived - add it to the message queue
|
||||
pendingMessages.push(msg);
|
||||
pendingMessages.push(msgInfo);
|
||||
if (activeMessage !== null) {
|
||||
// The node is currently processing a message, so do nothing
|
||||
// more with this message
|
||||
@@ -508,22 +556,23 @@ module.exports = function(RED) {
|
||||
|
||||
// There are more messages to process. Get the next message and
|
||||
// start processing it. Recurse back in to check for any more
|
||||
var nextMsg = pendingMessages.shift();
|
||||
var nextMsgInfo = pendingMessages.shift();
|
||||
activeMessage = true;
|
||||
reduceMessage(node, nextMsg, err => {
|
||||
reduceMessage(node, nextMsgInfo, err => {
|
||||
if (err) {
|
||||
node.error(err,nextMsg);
|
||||
}
|
||||
nextMsgInfo.done(err);//.error(err,nextMsg);
|
||||
}
|
||||
activeMessage = null;
|
||||
processReduceMessageQueue();
|
||||
})
|
||||
}
|
||||
|
||||
this.on("input", function(msg) {
|
||||
this.on("input", function(msg, send, done) {
|
||||
try {
|
||||
var property;
|
||||
if (node.mode === 'auto' && (!msg.hasOwnProperty("parts")||!msg.parts.hasOwnProperty("id"))) {
|
||||
node.warn("Message missing msg.parts property - cannot join in 'auto' mode")
|
||||
done();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -535,6 +584,7 @@ module.exports = function(RED) {
|
||||
property = RED.util.getMessageProperty(msg,node.property);
|
||||
} catch(err) {
|
||||
node.warn("Message property "+node.property+" not found");
|
||||
done();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -557,7 +607,7 @@ module.exports = function(RED) {
|
||||
propertyIndex = msg.parts.index;
|
||||
}
|
||||
else if (node.mode === 'reduce') {
|
||||
return processReduceMessageQueue(msg);
|
||||
return processReduceMessageQueue({msg, send, done});
|
||||
}
|
||||
else {
|
||||
// Use the node configuration to identify all of the group information
|
||||
@@ -578,9 +628,11 @@ module.exports = function(RED) {
|
||||
if (inflight[partId].timeout) {
|
||||
clearTimeout(inflight[partId].timeout);
|
||||
}
|
||||
inflight[partId].dones.forEach(f => f());
|
||||
delete inflight[partId]
|
||||
}
|
||||
return
|
||||
done();
|
||||
return;
|
||||
}
|
||||
|
||||
if ((payloadType === 'object') && (propertyKey === null || propertyKey === undefined || propertyKey === "")) {
|
||||
@@ -591,6 +643,7 @@ module.exports = function(RED) {
|
||||
if (msg.hasOwnProperty('complete')) {
|
||||
if (inflight[partId]) {
|
||||
inflight[partId].msg.complete = msg.complete;
|
||||
inflight[partId].send = send;
|
||||
completeSend(partId);
|
||||
}
|
||||
}
|
||||
@@ -598,6 +651,7 @@ module.exports = function(RED) {
|
||||
node.warn("Message missing key property 'msg."+node.key+"' - cannot add to object")
|
||||
}
|
||||
}
|
||||
done();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -608,7 +662,9 @@ module.exports = function(RED) {
|
||||
payload:{},
|
||||
targetCount:targetCount,
|
||||
type:"object",
|
||||
msg:RED.util.cloneMessage(msg)
|
||||
msg:RED.util.cloneMessage(msg),
|
||||
send: send,
|
||||
dones: []
|
||||
};
|
||||
}
|
||||
else {
|
||||
@@ -617,7 +673,9 @@ module.exports = function(RED) {
|
||||
payload:[],
|
||||
targetCount:targetCount,
|
||||
type:payloadType,
|
||||
msg:RED.util.cloneMessage(msg)
|
||||
msg:RED.util.cloneMessage(msg),
|
||||
send: send,
|
||||
dones: []
|
||||
};
|
||||
if (payloadType === 'string') {
|
||||
inflight[partId].joinChar = joinChar;
|
||||
@@ -634,6 +692,7 @@ module.exports = function(RED) {
|
||||
}, node.timer)
|
||||
}
|
||||
}
|
||||
inflight[partId].dones.push(done);
|
||||
|
||||
var group = inflight[partId];
|
||||
if (payloadType === 'buffer') {
|
||||
@@ -642,7 +701,7 @@ module.exports = function(RED) {
|
||||
inflight[partId].bufferLen += property.length;
|
||||
}
|
||||
else {
|
||||
node.error(RED._("join.errors.invalid-type",{error:(typeof property)}),msg);
|
||||
done(RED._("join.errors.invalid-type",{error:(typeof property)}));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -676,13 +735,18 @@ module.exports = function(RED) {
|
||||
}
|
||||
}
|
||||
group.msg = Object.assign(group.msg, msg);
|
||||
group.send = send;
|
||||
var tcnt = group.targetCount;
|
||||
if (msg.hasOwnProperty("parts")) { tcnt = group.targetCount || msg.parts.count; }
|
||||
if (msg.hasOwnProperty("parts")) {
|
||||
tcnt = group.targetCount || msg.parts.count;
|
||||
group.targetCount = tcnt;
|
||||
}
|
||||
if ((tcnt > 0 && group.currentCount >= tcnt) || msg.hasOwnProperty('complete')) {
|
||||
completeSend(partId);
|
||||
}
|
||||
}
|
||||
catch(err) {
|
||||
done(err);
|
||||
console.log(err.stack);
|
||||
}
|
||||
});
|
||||
@@ -691,9 +755,11 @@ module.exports = function(RED) {
|
||||
for (var i in inflight) {
|
||||
if (inflight.hasOwnProperty(i)) {
|
||||
clearTimeout(inflight[i].timeout);
|
||||
inflight[i].dones.forEach(d => d());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
RED.nodes.registerType("join",JoinNode);
|
||||
}
|
||||
|
||||
|
@@ -81,16 +81,16 @@ module.exports = function(RED) {
|
||||
|
||||
function sortMessageGroup(group) {
|
||||
var promise;
|
||||
var msgs = group.msgs;
|
||||
var msgInfos = group.msgInfos;
|
||||
if (key_is_exp) {
|
||||
var evaluatedDataPromises = msgs.map(msg => {
|
||||
var evaluatedDataPromises = msgInfos.map(mInfo => {
|
||||
return new Promise((resolve,reject) => {
|
||||
RED.util.evaluateJSONataExpression(key_exp, msg, (err, result) => {
|
||||
RED.util.evaluateJSONataExpression(key_exp, mInfo.msg, (err, result) => {
|
||||
if (err) {
|
||||
reject(RED._("sort.invalid-exp",{message:err.toString()}));
|
||||
} else {
|
||||
resolve({
|
||||
item: msg,
|
||||
item: mInfo,
|
||||
sortValue: result
|
||||
})
|
||||
}
|
||||
@@ -106,20 +106,21 @@ module.exports = function(RED) {
|
||||
var key = function(msg) {
|
||||
return ;
|
||||
}
|
||||
var comp = generateComparisonFunction(msg => RED.util.getMessageProperty(msg, key_prop));
|
||||
var comp = generateComparisonFunction(mInfo => RED.util.getMessageProperty(mInfo.msg, key_prop));
|
||||
try {
|
||||
msgs.sort(comp);
|
||||
msgInfos.sort(comp);
|
||||
}
|
||||
catch (e) {
|
||||
return; // not send when error
|
||||
}
|
||||
promise = Promise.resolve(msgs);
|
||||
promise = Promise.resolve(msgInfos);
|
||||
}
|
||||
return promise.then(msgs => {
|
||||
for (var i = 0; i < msgs.length; i++) {
|
||||
var msg = msgs[i];
|
||||
return promise.then(msgInfos => {
|
||||
for (let i = 0; i < msgInfos.length; i++) {
|
||||
const msg = msgInfos[i].msg;
|
||||
msg.parts.index = i;
|
||||
node.send(msg);
|
||||
msgInfos[i].send(msg);
|
||||
msgInfos[i].done();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -181,65 +182,79 @@ module.exports = function(RED) {
|
||||
}
|
||||
}
|
||||
if(oldest !== undefined) {
|
||||
oldest.msgInfos[oldest.msgInfos.length - 1].done(RED._("sort.too-many"));
|
||||
for (let i = 0; i < oldest.msgInfos.length - 1; i++) {
|
||||
oldest.msgInfos[i].done();
|
||||
}
|
||||
delete pending[oldest_key];
|
||||
return oldest.msgs.length;
|
||||
return oldest.msgInfos.length;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
function processMessage(msg) {
|
||||
function processMessage(msgInfo) {
|
||||
const msg = msgInfo.msg;
|
||||
if (target_is_prop) {
|
||||
sortMessageProperty(msg).then(send => {
|
||||
if (send) {
|
||||
node.send(msg);
|
||||
msgInfo.send(msg);
|
||||
}
|
||||
msgInfo.done();
|
||||
}).catch(err => {
|
||||
node.error(err,msg);
|
||||
msgInfo.done(err);
|
||||
});
|
||||
return;
|
||||
}
|
||||
var parts = msg.parts;
|
||||
if (!parts || !parts.hasOwnProperty("id") || !parts.hasOwnProperty("index")) {
|
||||
msgInfo.done();
|
||||
return;
|
||||
}
|
||||
var gid = parts.id;
|
||||
if (!pending.hasOwnProperty(gid)) {
|
||||
pending[gid] = {
|
||||
count: undefined,
|
||||
msgs: [],
|
||||
msgInfos: [],
|
||||
seq_no: pending_id++
|
||||
};
|
||||
}
|
||||
var group = pending[gid];
|
||||
var msgs = group.msgs;
|
||||
msgs.push(msg);
|
||||
var msgInfos = group.msgInfos;
|
||||
msgInfos.push(msgInfo);
|
||||
if (parts.hasOwnProperty("count")) {
|
||||
group.count = parts.count;
|
||||
}
|
||||
pending_count++;
|
||||
if (group.count === msgs.length) {
|
||||
if (group.count === msgInfos.length) {
|
||||
delete pending[gid]
|
||||
sortMessageGroup(group).catch(err => {
|
||||
node.error(err,msg);
|
||||
// throw an error for last message, and just call done() for remaining messages
|
||||
msgInfos[msgInfos.length-1].done(err);
|
||||
for (let i = 0; i < msgInfos.length - 1; i++) {
|
||||
msgInfos[i].done()
|
||||
};
|
||||
});
|
||||
pending_count -= msgs.length;
|
||||
pending_count -= msgInfos.length;
|
||||
} else {
|
||||
var max_msgs = max_kept_msgs_count(node);
|
||||
if ((max_msgs > 0) && (pending_count > max_msgs)) {
|
||||
pending_count -= removeOldestPending();
|
||||
node.error(RED._("sort.too-many"), msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.on("input", function(msg) {
|
||||
processMessage(msg);
|
||||
this.on("input", function(msg, send, done) {
|
||||
processMessage({msg, send, done});
|
||||
});
|
||||
|
||||
this.on("close", function() {
|
||||
for(var key in pending) {
|
||||
if (pending.hasOwnProperty(key)) {
|
||||
node.log(RED._("sort.clear"), pending[key].msgs[0]);
|
||||
node.log(RED._("sort.clear"), pending[key].msgInfos[0]);
|
||||
const group = pending[key];
|
||||
group.msgInfos.forEach(mInfo => {
|
||||
mInfo.done();
|
||||
});
|
||||
delete pending[key];
|
||||
}
|
||||
}
|
||||
|
@@ -32,11 +32,11 @@ module.exports = function(RED) {
|
||||
return _max_kept_msgs_count;
|
||||
}
|
||||
|
||||
function send_msgs(node, msgs, clone_msg) {
|
||||
var count = msgs.length;
|
||||
var msg_id = msgs[0]._msgid;
|
||||
function send_msgs(node, msgInfos, clone_msg) {
|
||||
var count = msgInfos.length;
|
||||
var msg_id = msgInfos[0].msg._msgid;
|
||||
for (var i = 0; i < count; i++) {
|
||||
var msg = clone_msg ? RED.util.cloneMessage(msgs[i]) : msgs[i];
|
||||
var msg = clone_msg ? RED.util.cloneMessage(msgInfos[i].msg) : msgInfos[i].msg;
|
||||
if (!msg.hasOwnProperty("parts")) {
|
||||
msg.parts = {};
|
||||
}
|
||||
@@ -44,14 +44,16 @@ module.exports = function(RED) {
|
||||
parts.id = msg_id;
|
||||
parts.index = i;
|
||||
parts.count = count;
|
||||
node.send(msg);
|
||||
msgInfos[i].send(msg);
|
||||
//msgInfos[i].done();
|
||||
}
|
||||
}
|
||||
|
||||
function send_interval(node, allow_empty_seq) {
|
||||
let msgs = node.pending;
|
||||
if (msgs.length > 0) {
|
||||
send_msgs(node, msgs, false);
|
||||
let msgInfos = node.pending;
|
||||
if (msgInfos.length > 0) {
|
||||
send_msgs(node, msgInfos, false);
|
||||
msgInfos.forEach(e => e.done());
|
||||
node.pending = [];
|
||||
}
|
||||
else {
|
||||
@@ -108,19 +110,20 @@ module.exports = function(RED) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
var msgs = [];
|
||||
var msgInfos = [];
|
||||
for (var topic of topics) {
|
||||
var t_msgs = get_msgs_of_topic(pending, topic);
|
||||
msgs = msgs.concat(t_msgs);
|
||||
var t_msgInfos = get_msgs_of_topic(pending, topic);
|
||||
msgInfos = msgInfos.concat(t_msgInfos);
|
||||
}
|
||||
for (var topic of topics) {
|
||||
remove_topic(pending, topic);
|
||||
}
|
||||
send_msgs(node, msgs, true);
|
||||
node.pending_count -= msgs.length;
|
||||
send_msgs(node, msgInfos, true);
|
||||
msgInfos.forEach(e => e.done() );
|
||||
node.pending_count -= msgInfos.length;
|
||||
}
|
||||
|
||||
function add_to_topic_group(pending, topic, gid, msg) {
|
||||
function add_to_topic_group(pending, topic, gid, msgInfo) {
|
||||
if (!pending.hasOwnProperty(topic)) {
|
||||
pending[topic] = { groups: {}, gids: [] };
|
||||
}
|
||||
@@ -132,32 +135,43 @@ module.exports = function(RED) {
|
||||
gids.push(gid);
|
||||
}
|
||||
var group = groups[gid];
|
||||
group.msgs.push(msg);
|
||||
group.msgs.push(msgInfo);
|
||||
if ((group.count === undefined) &&
|
||||
msg.parts.hasOwnProperty('count')) {
|
||||
group.count = msg.parts.count;
|
||||
msgInfo.msg.parts.hasOwnProperty('count')) {
|
||||
group.count = msgInfo.msg.parts.count;
|
||||
}
|
||||
}
|
||||
|
||||
function concat_msg(node, msg) {
|
||||
function concat_msg(node, msg, send, done) {
|
||||
var topic = msg.topic;
|
||||
if(node.topics.indexOf(topic) >= 0) {
|
||||
if (!msg.hasOwnProperty("parts") ||
|
||||
!msg.parts.hasOwnProperty("id") ||
|
||||
!msg.parts.hasOwnProperty("index") ||
|
||||
!msg.parts.hasOwnProperty("count")) {
|
||||
node.error(RED._("batch.no-parts"), msg);
|
||||
done(RED._("batch.no-parts"));
|
||||
return;
|
||||
}
|
||||
var gid = msg.parts.id;
|
||||
var pending = node.pending;
|
||||
add_to_topic_group(pending, topic, gid, msg);
|
||||
add_to_topic_group(pending, topic, gid, {msg, send, done});
|
||||
node.pending_count++;
|
||||
var max_msgs = max_kept_msgs_count(node);
|
||||
if ((max_msgs > 0) && (node.pending_count > max_msgs)) {
|
||||
Object.values(node.pending).forEach(p_topic => {
|
||||
Object.values(p_topic.groups).forEach(group => {
|
||||
group.msgs.forEach(msgInfo => {
|
||||
if (msgInfo.msg.id === msg.id) {
|
||||
// the message that caused the overflow
|
||||
msgInfo.done(RED._("batch.too-many"));
|
||||
} else {
|
||||
msgInfo.done();
|
||||
}
|
||||
})
|
||||
})
|
||||
});
|
||||
node.pending = {};
|
||||
node.pending_count = 0;
|
||||
node.error(RED._("batch.too-many"), msg);
|
||||
}
|
||||
try_concat(node, pending);
|
||||
}
|
||||
@@ -178,29 +192,37 @@ module.exports = function(RED) {
|
||||
return;
|
||||
}
|
||||
node.pending = [];
|
||||
this.on("input", function(msg) {
|
||||
this.on("input", function(msg, send, done) {
|
||||
if (msg.hasOwnProperty("reset")) {
|
||||
node.pending.forEach(e => e.done());
|
||||
node.pending = [];
|
||||
node.pending_count = 0;
|
||||
done();
|
||||
return;
|
||||
}
|
||||
var queue = node.pending;
|
||||
queue.push(msg);
|
||||
queue.push({msg, send, done});
|
||||
node.pending_count++;
|
||||
if (queue.length === count) {
|
||||
send_msgs(node, queue, is_overlap);
|
||||
for (let i = 0; i < queue.length-overlap; i++) {
|
||||
queue[i].done();
|
||||
}
|
||||
node.pending =
|
||||
(overlap === 0) ? [] : queue.slice(-overlap);
|
||||
node.pending_count = 0;
|
||||
}
|
||||
var max_msgs = max_kept_msgs_count(node);
|
||||
if ((max_msgs > 0) && (node.pending_count > max_msgs)) {
|
||||
let lastMInfo = node.pending.pop();
|
||||
lastMInfo.done(RED._("batch.too-many"));
|
||||
node.pending.forEach(e => e.done());
|
||||
node.pending = [];
|
||||
node.pending_count = 0;
|
||||
node.error(RED._("batch.too-many"), msg);
|
||||
}
|
||||
});
|
||||
this.on("close", function() {
|
||||
node.pending.forEach(e=> e.done());
|
||||
node.pending_count = 0;
|
||||
node.pending = [];
|
||||
});
|
||||
@@ -217,31 +239,36 @@ module.exports = function(RED) {
|
||||
if (interval > 0) {
|
||||
timer = setInterval(msgHandler, interval);
|
||||
}
|
||||
this.on("input", function(msg) {
|
||||
this.on("input", function(msg, send, done) {
|
||||
if (msg.hasOwnProperty("reset")) {
|
||||
if (timer !== undefined) {
|
||||
clearInterval(timer);
|
||||
}
|
||||
node.pending.forEach(e => e.done());
|
||||
node.pending = [];
|
||||
node.pending_count = 0;
|
||||
done();
|
||||
if (interval > 0) {
|
||||
timer = setInterval(msgHandler, interval);
|
||||
}
|
||||
return;
|
||||
}
|
||||
node.pending.push(msg);
|
||||
node.pending.push({msg, send, done});
|
||||
node.pending_count++;
|
||||
var max_msgs = max_kept_msgs_count(node);
|
||||
if ((max_msgs > 0) && (node.pending_count > max_msgs)) {
|
||||
let lastMInfo = node.pending.pop();
|
||||
lastMInfo.done(RED._("batch.too-many"));
|
||||
node.pending.forEach(e => e.done());
|
||||
node.pending = [];
|
||||
node.pending_count = 0;
|
||||
node.error(RED._("batch.too-many"), msg);
|
||||
}
|
||||
});
|
||||
this.on("close", function() {
|
||||
if (timer !== undefined) {
|
||||
clearInterval(timer);
|
||||
}
|
||||
node.pending.forEach(e => e.done());
|
||||
node.pending = [];
|
||||
node.pending_count = 0;
|
||||
});
|
||||
@@ -251,15 +278,26 @@ module.exports = function(RED) {
|
||||
return x.topic;
|
||||
});
|
||||
node.pending = {};
|
||||
this.on("input", function(msg) {
|
||||
this.on("input", function(msg, send, done) {
|
||||
if (msg.hasOwnProperty("reset")) {
|
||||
Object.values(node.pending).forEach(p_topic => {
|
||||
Object.values(p_topic.groups).forEach(group => {
|
||||
group.msgs.forEach(e => e.done());
|
||||
});
|
||||
});
|
||||
node.pending = {};
|
||||
node.pending_count = 0;
|
||||
done();
|
||||
return;
|
||||
}
|
||||
concat_msg(node, msg);
|
||||
concat_msg(node, msg, send, done);
|
||||
});
|
||||
this.on("close", function() {
|
||||
Object.values(node.pending).forEach(p_topic => {
|
||||
Object.values(p_topic.groups).forEach(group => {
|
||||
group.msgs.forEach(e => e.done());
|
||||
});
|
||||
});
|
||||
node.pending = {};
|
||||
node.pending_count = 0;
|
||||
});
|
||||
|
@@ -0,0 +1,99 @@
|
||||
[
|
||||
{
|
||||
"id": "330f4888.cccb28",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 260,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"ed11f8d6.5e3c88"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "a0288b44.71d488",
|
||||
"type": "csv",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"sep": ",",
|
||||
"hdrin": "",
|
||||
"hdrout": "none",
|
||||
"multi": "one",
|
||||
"ret": "\\n",
|
||||
"temp": "",
|
||||
"skip": "0",
|
||||
"strings": true,
|
||||
"include_empty_strings": "",
|
||||
"include_null_values": "",
|
||||
"x": 600,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"369cbe42.4af9f2"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ed11f8d6.5e3c88",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "CSV data",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "text",
|
||||
"syntax": "mustache",
|
||||
"template": "Apple,100,Canada\nOrange,120,USA\nBanana,80,Philippines",
|
||||
"output": "str",
|
||||
"x": 430,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"a0288b44.71d488"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "369cbe42.4af9f2",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 780,
|
||||
"y": 180,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "783cfaa6.52fbe4",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Parse CSV with default column name as messages",
|
||||
"info": "CSV node can parse input CSV data.\nParsed CSV record can be sent as a message sequence.\nEach message payload points to an object with `col`*N* as a key and CSV value as a value.\n",
|
||||
"x": 330,
|
||||
"y": 120,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,99 @@
|
||||
[
|
||||
{
|
||||
"id": "98c9d44d.4457b8",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 260,
|
||||
"y": 360,
|
||||
"wires": [
|
||||
[
|
||||
"65476517.3d760c"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "76df98f7.0dcd08",
|
||||
"type": "csv",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"sep": ",",
|
||||
"hdrin": "",
|
||||
"hdrout": "none",
|
||||
"multi": "mult",
|
||||
"ret": "\\n",
|
||||
"temp": "",
|
||||
"skip": "0",
|
||||
"strings": true,
|
||||
"include_empty_strings": "",
|
||||
"include_null_values": "",
|
||||
"x": 600,
|
||||
"y": 360,
|
||||
"wires": [
|
||||
[
|
||||
"557979e0.e6b588"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "65476517.3d760c",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "CSV data",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "text",
|
||||
"syntax": "mustache",
|
||||
"template": "Apple,100,Canada\nOrange,120,USA\nBanana,80,Philippines",
|
||||
"output": "str",
|
||||
"x": 430,
|
||||
"y": 360,
|
||||
"wires": [
|
||||
[
|
||||
"76df98f7.0dcd08"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "557979e0.e6b588",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 780,
|
||||
"y": 360,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "187f4ab3.4c9ab5",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Parse CSV with default column name as array",
|
||||
"info": "CSV node can send a single message with array of parsed CSV records.\nEach element of the array consists of objects with key-value pair.",
|
||||
"x": 320,
|
||||
"y": 300,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,99 @@
|
||||
[
|
||||
{
|
||||
"id": "1216e95b.1b1e87",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 260,
|
||||
"y": 560,
|
||||
"wires": [
|
||||
[
|
||||
"e41ffbbc.de2ed8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "286828bc.9233c8",
|
||||
"type": "csv",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"sep": ",",
|
||||
"hdrin": "",
|
||||
"hdrout": "none",
|
||||
"multi": "one",
|
||||
"ret": "\\n",
|
||||
"temp": "kind,price,origin",
|
||||
"skip": "0",
|
||||
"strings": true,
|
||||
"include_empty_strings": "",
|
||||
"include_null_values": "",
|
||||
"x": 600,
|
||||
"y": 560,
|
||||
"wires": [
|
||||
[
|
||||
"9d8218c.5550ee8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "e41ffbbc.de2ed8",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "CSV data",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "text",
|
||||
"syntax": "mustache",
|
||||
"template": "Apple,100,Canada\nOrange,120,USA\nBanana,80,Philippines",
|
||||
"output": "str",
|
||||
"x": 430,
|
||||
"y": 560,
|
||||
"wires": [
|
||||
[
|
||||
"286828bc.9233c8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "9d8218c.5550ee8",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 780,
|
||||
"y": 560,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "aaa1ee8f.21e2c",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Parse CSV with specified column name as messages",
|
||||
"info": "CSV node can specify column name of parsed objects in its settings panel.",
|
||||
"x": 340,
|
||||
"y": 500,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,99 @@
|
||||
[
|
||||
{
|
||||
"id": "24093558.0315aa",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 260,
|
||||
"y": 740,
|
||||
"wires": [
|
||||
[
|
||||
"80abaee1.5fa7f"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "d4d2ca3f.1d9488",
|
||||
"type": "csv",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"sep": ",",
|
||||
"hdrin": true,
|
||||
"hdrout": "none",
|
||||
"multi": "one",
|
||||
"ret": "\\n",
|
||||
"temp": "",
|
||||
"skip": "0",
|
||||
"strings": true,
|
||||
"include_empty_strings": "",
|
||||
"include_null_values": "",
|
||||
"x": 600,
|
||||
"y": 740,
|
||||
"wires": [
|
||||
[
|
||||
"b52791c3.08967"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "80abaee1.5fa7f",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "CSV data",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "text",
|
||||
"syntax": "mustache",
|
||||
"template": "kind,price,origin\nApple,100,Canada\nOrange,120,USA\nBanana,80,Philippines",
|
||||
"output": "str",
|
||||
"x": 430,
|
||||
"y": 740,
|
||||
"wires": [
|
||||
[
|
||||
"d4d2ca3f.1d9488"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "b52791c3.08967",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 780,
|
||||
"y": 740,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "85091361.85644",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Parse CSV with column name in first row as messages",
|
||||
"info": "CSV node can use first row of input CSV text as a column name of each record object.\n",
|
||||
"x": 340,
|
||||
"y": 680,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,99 @@
|
||||
[
|
||||
{
|
||||
"id": "9e93169c.b763a8",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Convert JavaScript object to CSV",
|
||||
"info": "CSV node can convert a JavaScript object to CSV text.\nEach object contains key-value pair of specified properties.\n",
|
||||
"x": 270,
|
||||
"y": 860,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "8ca41fee.3303d",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 260,
|
||||
"y": 920,
|
||||
"wires": [
|
||||
[
|
||||
"c466905b.e8c61"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "65146d20.d78204",
|
||||
"type": "csv",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"sep": ",",
|
||||
"hdrin": false,
|
||||
"hdrout": "none",
|
||||
"multi": "one",
|
||||
"ret": "\\n",
|
||||
"temp": "kind,price",
|
||||
"skip": "0",
|
||||
"strings": true,
|
||||
"include_empty_strings": "",
|
||||
"include_null_values": "",
|
||||
"x": 600,
|
||||
"y": 920,
|
||||
"wires": [
|
||||
[
|
||||
"92e99e67.a37d8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "c466905b.e8c61",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "JS object",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "{\n \"kind\": \"Apple\",\n \"price\": 100,\n \"origin\": \"Canada\"\n}",
|
||||
"output": "json",
|
||||
"x": 430,
|
||||
"y": 920,
|
||||
"wires": [
|
||||
[
|
||||
"65146d20.d78204"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "92e99e67.a37d8",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 780,
|
||||
"y": 920,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,99 @@
|
||||
[
|
||||
{
|
||||
"id": "e89019c5.70ae78",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Convert array of JavaScript objects to CSV",
|
||||
"info": "CSV node can convert an array of JavaScript objects to multi-line CSV text.",
|
||||
"x": 300,
|
||||
"y": 1020,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "bd0d82ed.7b28",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 260,
|
||||
"y": 1080,
|
||||
"wires": [
|
||||
[
|
||||
"1d857b8d.3a4014"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "66a37667.16ebd8",
|
||||
"type": "csv",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"sep": ",",
|
||||
"hdrin": false,
|
||||
"hdrout": "none",
|
||||
"multi": "one",
|
||||
"ret": "\\n",
|
||||
"temp": "kind,price",
|
||||
"skip": "0",
|
||||
"strings": true,
|
||||
"include_empty_strings": "",
|
||||
"include_null_values": "",
|
||||
"x": 600,
|
||||
"y": 1080,
|
||||
"wires": [
|
||||
[
|
||||
"859725fd.dc93d8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "1d857b8d.3a4014",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "JS object",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "[\n {\n \"kind\": \"Apple\",\n \"price\": 100,\n \"origin\": \"Canada\"\n },\n {\n \"kind\": \"Orange\",\n \"price\": 120,\n \"origin\": \"USA\"\n },\n {\n \"kind\": \"Banana\",\n \"price\": 80,\n \"origin\": \"Philippines\"\n }\n]",
|
||||
"output": "json",
|
||||
"x": 430,
|
||||
"y": 1080,
|
||||
"wires": [
|
||||
[
|
||||
"66a37667.16ebd8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "859725fd.dc93d8",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 780,
|
||||
"y": 1080,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,99 @@
|
||||
[
|
||||
{
|
||||
"id": "2ebdd51e.c5d17a",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Convert array of JavaScript objects to CSV with column name header",
|
||||
"info": "CSV node can convert an array of JavaScript objects to multi-line CSV text with column name header at first line.",
|
||||
"x": 390,
|
||||
"y": 1200,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "2b4d538d.ada07c",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 260,
|
||||
"y": 1260,
|
||||
"wires": [
|
||||
[
|
||||
"3e5c9e8.5065b62"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "db02c7be.0984e8",
|
||||
"type": "csv",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"sep": ",",
|
||||
"hdrin": false,
|
||||
"hdrout": "all",
|
||||
"multi": "one",
|
||||
"ret": "\\n",
|
||||
"temp": "kind,price",
|
||||
"skip": "0",
|
||||
"strings": true,
|
||||
"include_empty_strings": "",
|
||||
"include_null_values": "",
|
||||
"x": 600,
|
||||
"y": 1260,
|
||||
"wires": [
|
||||
[
|
||||
"61f8b772.ddb1f8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "3e5c9e8.5065b62",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "JS object",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "[\n {\n \"kind\": \"Apple\",\n \"price\": 100,\n \"origin\": \"Canada\"\n },\n {\n \"kind\": \"Orange\",\n \"price\": 120,\n \"origin\": \"USA\"\n },\n {\n \"kind\": \"Banana\",\n \"price\": 80,\n \"origin\": \"Philippines\"\n }\n]",
|
||||
"output": "json",
|
||||
"x": 430,
|
||||
"y": 1260,
|
||||
"wires": [
|
||||
[
|
||||
"db02c7be.0984e8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "61f8b772.ddb1f8",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 780,
|
||||
"y": 1260,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,99 @@
|
||||
[
|
||||
{
|
||||
"id": "2ebdd51e.c5d17a",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Convert array of JavaScript objects to CSV with column name header",
|
||||
"info": "CSV node can convert an array of JavaScript objects to multi-line CSV text with column name header at first line.",
|
||||
"x": 390,
|
||||
"y": 1200,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "2b4d538d.ada07c",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 260,
|
||||
"y": 1260,
|
||||
"wires": [
|
||||
[
|
||||
"3e5c9e8.5065b62"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "db02c7be.0984e8",
|
||||
"type": "csv",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"sep": ",",
|
||||
"hdrin": false,
|
||||
"hdrout": "all",
|
||||
"multi": "one",
|
||||
"ret": "\\n",
|
||||
"temp": "kind,price",
|
||||
"skip": "0",
|
||||
"strings": true,
|
||||
"include_empty_strings": "",
|
||||
"include_null_values": "",
|
||||
"x": 600,
|
||||
"y": 1260,
|
||||
"wires": [
|
||||
[
|
||||
"61f8b772.ddb1f8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "3e5c9e8.5065b62",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "JS object",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "[\n {\n \"kind\": \"Apple\",\n \"price\": 100,\n \"origin\": \"Canada\"\n },\n {\n \"kind\": \"Orange\",\n \"price\": 120,\n \"origin\": \"USA\"\n },\n {\n \"kind\": \"Banana\",\n \"price\": 80,\n \"origin\": \"Philippines\"\n }\n]",
|
||||
"output": "json",
|
||||
"x": 430,
|
||||
"y": 1260,
|
||||
"wires": [
|
||||
[
|
||||
"db02c7be.0984e8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "61f8b772.ddb1f8",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 780,
|
||||
"y": 1260,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,200 @@
|
||||
[
|
||||
{
|
||||
"id": "1ae28939.9f5fc7",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Send column name when reset property set",
|
||||
"info": "CSV node can send column names at first or `reset` property exists in input message.",
|
||||
"x": 310,
|
||||
"y": 1540,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "c16ad95b.4f9ac8",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Apple",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 250,
|
||||
"y": 1600,
|
||||
"wires": [
|
||||
[
|
||||
"7f7bfc72.aed104"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "870620b9.95343",
|
||||
"type": "csv",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"sep": ",",
|
||||
"hdrin": false,
|
||||
"hdrout": "once",
|
||||
"multi": "one",
|
||||
"ret": "\\n",
|
||||
"temp": "kind,price",
|
||||
"skip": "0",
|
||||
"strings": true,
|
||||
"include_empty_strings": "",
|
||||
"include_null_values": "",
|
||||
"x": 650,
|
||||
"y": 1720,
|
||||
"wires": [
|
||||
[
|
||||
"d960de42.619c7"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7f7bfc72.aed104",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "JS object",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "{\n \"kind\": \"Apple\",\n \"price\": 100,\n \"origin\": \"Canada\"\n}",
|
||||
"output": "json",
|
||||
"x": 470,
|
||||
"y": 1600,
|
||||
"wires": [
|
||||
[
|
||||
"870620b9.95343"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "d960de42.619c7",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 830,
|
||||
"y": 1720,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "6f8296e.f95ca68",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Orange",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 250,
|
||||
"y": 1660,
|
||||
"wires": [
|
||||
[
|
||||
"c37d0dfa.ec1ab"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "c37d0dfa.ec1ab",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "JS object",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "{\n \"kind\": \"Orange\",\n \"price\": 120,\n \"origin\": \"USA\"\n}\n",
|
||||
"output": "json",
|
||||
"x": 470,
|
||||
"y": 1660,
|
||||
"wires": [
|
||||
[
|
||||
"870620b9.95343"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "35209fe2.16926",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Banana & reset",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
},
|
||||
{
|
||||
"p": "reset",
|
||||
"v": "",
|
||||
"vt": "date"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 280,
|
||||
"y": 1720,
|
||||
"wires": [
|
||||
[
|
||||
"afd4e6b3.624a28"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "afd4e6b3.624a28",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "JS object",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "{\n \"kind\": \"Banana\",\n \"price\": 80,\n \"origin\": \"Philippines\"\n}",
|
||||
"output": "json",
|
||||
"x": 470,
|
||||
"y": 1720,
|
||||
"wires": [
|
||||
[
|
||||
"870620b9.95343"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
@@ -0,0 +1,150 @@
|
||||
[
|
||||
{
|
||||
"id": "195c168c.44f149",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 260,
|
||||
"y": 1900,
|
||||
"wires": [
|
||||
[
|
||||
"b270564c.171908"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "8ec8cf9e.103fa",
|
||||
"type": "csv",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"sep": ",",
|
||||
"hdrin": true,
|
||||
"hdrout": "none",
|
||||
"multi": "one",
|
||||
"ret": "\\n",
|
||||
"temp": "",
|
||||
"skip": "0",
|
||||
"strings": true,
|
||||
"include_empty_strings": "",
|
||||
"include_null_values": "",
|
||||
"x": 600,
|
||||
"y": 1900,
|
||||
"wires": [
|
||||
[
|
||||
"5c5254a8.bc562c"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "b270564c.171908",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "CSV data",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "text",
|
||||
"syntax": "mustache",
|
||||
"template": "kind,price,origin\nApple,100,Canada\nOrange,120,USA\nBanana,80,Philippines",
|
||||
"output": "str",
|
||||
"x": 430,
|
||||
"y": 1900,
|
||||
"wires": [
|
||||
[
|
||||
"8ec8cf9e.103fa"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "1c7be442.6a4bdc",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 1090,
|
||||
"y": 1900,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "d3da7cfb.cf596",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Join parsed CSV message sequence using join node",
|
||||
"info": "Parset CSV message sequence can be joined by join node.",
|
||||
"x": 330,
|
||||
"y": 1840,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "a07c9e26.c84fd",
|
||||
"type": "csv",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"sep": ",",
|
||||
"hdrin": "",
|
||||
"hdrout": "none",
|
||||
"multi": "one",
|
||||
"ret": "\\n",
|
||||
"temp": "kind,price",
|
||||
"skip": "0",
|
||||
"strings": true,
|
||||
"include_empty_strings": "",
|
||||
"include_null_values": "",
|
||||
"x": 910,
|
||||
"y": 1900,
|
||||
"wires": [
|
||||
[
|
||||
"1c7be442.6a4bdc"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "5c5254a8.bc562c",
|
||||
"type": "join",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"mode": "auto",
|
||||
"build": "string",
|
||||
"property": "payload",
|
||||
"propertyType": "msg",
|
||||
"key": "topic",
|
||||
"joiner": "\\n",
|
||||
"joinerType": "str",
|
||||
"accumulate": false,
|
||||
"timeout": "",
|
||||
"count": "",
|
||||
"reduceRight": false,
|
||||
"reduceExp": "",
|
||||
"reduceInit": "",
|
||||
"reduceInitType": "",
|
||||
"reduceFixup": "",
|
||||
"x": 750,
|
||||
"y": 1900,
|
||||
"wires": [
|
||||
[
|
||||
"a07c9e26.c84fd"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
@@ -0,0 +1,94 @@
|
||||
[
|
||||
{
|
||||
"id": "8c5224a6.201b88",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 220,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"d6c67e51.0d709"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "d6c67e51.0d709",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "HTML text",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "handlebars",
|
||||
"syntax": "plain",
|
||||
"template": "<html>\n <head>\n <title>List of Fruits</title>\n </head>\n <body>\n <ul>\n <li class=\"Item\">Apple</li>\n <li class=\"Item\">Orange</li>\n <li class=\"Item\">Banana</li>\n </ul>\n </body>\n</html>\n",
|
||||
"output": "str",
|
||||
"x": 390,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"599a1155.61a5c"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "b0d5cd89.338df",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Extract array of HTML element by CSS selector",
|
||||
"info": "HTML node can be used to extract elements in HTML document as an array using CSS selector.",
|
||||
"x": 280,
|
||||
"y": 120,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "599a1155.61a5c",
|
||||
"type": "html",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"property": "payload",
|
||||
"outproperty": "payload",
|
||||
"tag": ".Item",
|
||||
"ret": "html",
|
||||
"as": "single",
|
||||
"x": 550,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"942b23d1.cce09"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "942b23d1.cce09",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 710,
|
||||
"y": 180,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,94 @@
|
||||
[
|
||||
{
|
||||
"id": "a44973e8.6319b",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 220,
|
||||
"y": 360,
|
||||
"wires": [
|
||||
[
|
||||
"de1b012e.96ec3"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "de1b012e.96ec3",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "HTML text",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "handlebars",
|
||||
"syntax": "plain",
|
||||
"template": "<html>\n <head>\n <title>List of Fruits</title>\n </head>\n <body>\n <ul>\n <li class=\"Item\">Apple</li>\n <li class=\"Item\">Orange</li>\n <li class=\"Item\">Banana</li>\n </ul>\n </body>\n</html>\n",
|
||||
"output": "str",
|
||||
"x": 390,
|
||||
"y": 360,
|
||||
"wires": [
|
||||
[
|
||||
"cee70712.6f3538"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "99e32bc7.c8e508",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Extract sequence of HTML element by CSS selector",
|
||||
"info": "HTML node can be used to extract elements in HTML document as a messege sequence using CSS selector.",
|
||||
"x": 290,
|
||||
"y": 300,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "cee70712.6f3538",
|
||||
"type": "html",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"property": "payload",
|
||||
"outproperty": "payload",
|
||||
"tag": ".Item",
|
||||
"ret": "html",
|
||||
"as": "multi",
|
||||
"x": 550,
|
||||
"y": 360,
|
||||
"wires": [
|
||||
[
|
||||
"17f25482.d4b56b"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "17f25482.d4b56b",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 710,
|
||||
"y": 360,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,121 @@
|
||||
[
|
||||
{
|
||||
"id": "653ce9aa.b6a1c8",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 220,
|
||||
"y": 560,
|
||||
"wires": [
|
||||
[
|
||||
"52a16f7f.447d8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "52a16f7f.447d8",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "HTML text",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "handlebars",
|
||||
"syntax": "plain",
|
||||
"template": "<html>\n <head>\n <title>List of Fruits</title>\n </head>\n <body>\n <ul>\n <li class=\"Item\">Apple</li>\n <li class=\"Item\">Orange</li>\n <li class=\"Item\">Banana</li>\n </ul>\n </body>\n</html>\n",
|
||||
"output": "str",
|
||||
"x": 390,
|
||||
"y": 560,
|
||||
"wires": [
|
||||
[
|
||||
"a52319c3.89b008"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "8bc35379.31d99",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Extract array of HTML element by CSS selector specified in message",
|
||||
"info": "CSS selector for HTML node can be specified by `select` property of input message.",
|
||||
"x": 350,
|
||||
"y": 500,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "9c49de8a.bad25",
|
||||
"type": "html",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"property": "payload",
|
||||
"outproperty": "payload",
|
||||
"tag": "",
|
||||
"ret": "html",
|
||||
"as": "single",
|
||||
"x": 730,
|
||||
"y": 560,
|
||||
"wires": [
|
||||
[
|
||||
"d4f4b987.278a68"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "d4f4b987.278a68",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 890,
|
||||
"y": 560,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "a52319c3.89b008",
|
||||
"type": "change",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"rules": [
|
||||
{
|
||||
"t": "set",
|
||||
"p": "select",
|
||||
"pt": "msg",
|
||||
"to": ".Item",
|
||||
"tot": "str"
|
||||
}
|
||||
],
|
||||
"action": "",
|
||||
"property": "",
|
||||
"from": "",
|
||||
"to": "",
|
||||
"reg": false,
|
||||
"x": 560,
|
||||
"y": 560,
|
||||
"wires": [
|
||||
[
|
||||
"9c49de8a.bad25"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
@@ -0,0 +1,122 @@
|
||||
[
|
||||
{
|
||||
"id": "66cff4ee.f2761c",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 220,
|
||||
"y": 760,
|
||||
"wires": [
|
||||
[
|
||||
"2baaf6bf.0a02ca"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "2baaf6bf.0a02ca",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "HTML text",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "handlebars",
|
||||
"syntax": "plain",
|
||||
"template": "<html>\n <head>\n <title>List of Fruits</title>\n </head>\n <body>\n <ul>\n <li class=\"Item\">Apple</li>\n <li class=\"Item\">Orange</li>\n <li class=\"Item\">Banana</li>\n </ul>\n </body>\n</html>\n",
|
||||
"output": "str",
|
||||
"x": 390,
|
||||
"y": 760,
|
||||
"wires": [
|
||||
[
|
||||
"bbb22e6b.0fa25"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "a57d35d0.8aa538",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Join extracted sequence of HTML element using join node",
|
||||
"info": "Message sequence extracted by HTML node can be combined using join node.",
|
||||
"x": 310,
|
||||
"y": 700,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "bbb22e6b.0fa25",
|
||||
"type": "html",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"property": "payload",
|
||||
"outproperty": "payload",
|
||||
"tag": ".Item",
|
||||
"ret": "html",
|
||||
"as": "multi",
|
||||
"x": 550,
|
||||
"y": 760,
|
||||
"wires": [
|
||||
[
|
||||
"bd01ca4.966ad38"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "4d2616a8.84de88",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 850,
|
||||
"y": 760,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "bd01ca4.966ad38",
|
||||
"type": "join",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"mode": "custom",
|
||||
"build": "string",
|
||||
"property": "payload",
|
||||
"propertyType": "msg",
|
||||
"key": "topic",
|
||||
"joiner": ",",
|
||||
"joinerType": "str",
|
||||
"accumulate": false,
|
||||
"timeout": "",
|
||||
"count": "",
|
||||
"reduceRight": false,
|
||||
"reduceExp": "",
|
||||
"reduceInit": "",
|
||||
"reduceInitType": "",
|
||||
"reduceFixup": "",
|
||||
"x": 690,
|
||||
"y": 760,
|
||||
"wires": [
|
||||
[
|
||||
"4d2616a8.84de88"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
@@ -0,0 +1,92 @@
|
||||
[
|
||||
{
|
||||
"id": "9976e95d.2f8398",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 240,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"d94fc083.49d87"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "6684abb1.8eb454",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Convert JSON string to JS object",
|
||||
"info": "JSON node can convert JSON string to JavaScript object.",
|
||||
"x": 250,
|
||||
"y": 120,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "d94fc083.49d87",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "JSON string",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "{\n \"kind\": \"Apple\",\n \"price\": 100,\n \"origin\": \"Canada\"\n}",
|
||||
"output": "str",
|
||||
"x": 410,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"1a3dc54a.78598b"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "8950a55d.023988",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 730,
|
||||
"y": 180,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "1a3dc54a.78598b",
|
||||
"type": "json",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"property": "payload",
|
||||
"action": "",
|
||||
"pretty": false,
|
||||
"x": 570,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"8950a55d.023988"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
@@ -0,0 +1,92 @@
|
||||
[
|
||||
{
|
||||
"id": "cb13761f.56c328",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 240,
|
||||
"y": 380,
|
||||
"wires": [
|
||||
[
|
||||
"c607642a.78c3c8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "180b1e22.0074e2",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Convert JS object to JSON string",
|
||||
"info": "JSON node can convert JavaScript object to JSON string.",
|
||||
"x": 250,
|
||||
"y": 320,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "c607642a.78c3c8",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "JS object",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "{\n \"kind\": \"Apple\",\n \"price\": 100,\n \"origin\": \"Canada\"\n}",
|
||||
"output": "json",
|
||||
"x": 400,
|
||||
"y": 380,
|
||||
"wires": [
|
||||
[
|
||||
"bf309844.fa12e8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "5b6b130b.72a14c",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 730,
|
||||
"y": 380,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "bf309844.fa12e8",
|
||||
"type": "json",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"property": "payload",
|
||||
"action": "",
|
||||
"pretty": false,
|
||||
"x": 570,
|
||||
"y": 380,
|
||||
"wires": [
|
||||
[
|
||||
"5b6b130b.72a14c"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
160
packages/node_modules/@node-red/nodes/examples/parser/json/03 - Validate input JSON string.json
vendored
Normal file
160
packages/node_modules/@node-red/nodes/examples/parser/json/03 - Validate input JSON string.json
vendored
Normal file
@@ -0,0 +1,160 @@
|
||||
[
|
||||
{
|
||||
"id": "2b18621b.e2670e",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "OK",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 230,
|
||||
"y": 580,
|
||||
"wires": [
|
||||
[
|
||||
"5986faee.aef954"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "59acf99.9a92308",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Validate input JSON string",
|
||||
"info": "JSON node can validate input JSON string using [JSON schema](https://json-schema.org/) when converting to JavaScript object.",
|
||||
"x": 230,
|
||||
"y": 520,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "5986faee.aef954",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "JSON string",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "{\n \"kind\": \"Apple\",\n \"price\": 100,\n \"origin\": \"Canada\"\n}",
|
||||
"output": "str",
|
||||
"x": 410,
|
||||
"y": 580,
|
||||
"wires": [
|
||||
[
|
||||
"f8a67c6d.4f1f1"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ca27c92c.ad7cb8",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "payload",
|
||||
"targetType": "msg",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 910,
|
||||
"y": 580,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "2fad9978.ea1916",
|
||||
"type": "json",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"property": "payload",
|
||||
"action": "",
|
||||
"pretty": false,
|
||||
"x": 750,
|
||||
"y": 580,
|
||||
"wires": [
|
||||
[
|
||||
"ca27c92c.ad7cb8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "f8a67c6d.4f1f1",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Schema",
|
||||
"field": "schema",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "{\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"type\": \"string\"\n },\n \"price\": {\n \"type\": \"number\"\n },\n \"origin\": {\n \"type\": \"string\"\n }\n }\n}",
|
||||
"output": "json",
|
||||
"x": 590,
|
||||
"y": 580,
|
||||
"wires": [
|
||||
[
|
||||
"2fad9978.ea1916"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "8337e847.ac18d8",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "NG",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 230,
|
||||
"y": 660,
|
||||
"wires": [
|
||||
[
|
||||
"fa14d8bf.1ac938"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "fa14d8bf.1ac938",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "JSON string",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "{\n \"kind\": \"Apple\",\n \"price\": \"100\",\n \"origin\": \"Canada\"\n}",
|
||||
"output": "str",
|
||||
"x": 410,
|
||||
"y": 660,
|
||||
"wires": [
|
||||
[
|
||||
"f8a67c6d.4f1f1"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
@@ -0,0 +1,92 @@
|
||||
[
|
||||
{
|
||||
"id": "82f1bd0b.43474",
|
||||
"type": "xml",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"property": "payload",
|
||||
"attr": "",
|
||||
"chr": "",
|
||||
"x": 530,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"1cd4ad02.9a5423"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "84222b92.d65d18",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 200,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"cdd1c154.3a655"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7b014430.dfd94c",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Convert JavaScript object to XML",
|
||||
"info": "XML node can convert JavaScript object to XML string.",
|
||||
"x": 240,
|
||||
"y": 120,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "1cd4ad02.9a5423",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 690,
|
||||
"y": 180,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "cdd1c154.3a655",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "JS object",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "{\n \"kind\": \"Apple\",\n \"price\": 100,\n \"origin\": \"Canada\"\n}",
|
||||
"output": "json",
|
||||
"x": 360,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"82f1bd0b.43474"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
@@ -0,0 +1,92 @@
|
||||
[
|
||||
{
|
||||
"id": "93e423a9.a407d",
|
||||
"type": "xml",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"property": "payload",
|
||||
"attr": "",
|
||||
"chr": "",
|
||||
"x": 530,
|
||||
"y": 360,
|
||||
"wires": [
|
||||
[
|
||||
"2d0dde7e.a50082"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ba1dab90.8d1da8",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 200,
|
||||
"y": 360,
|
||||
"wires": [
|
||||
[
|
||||
"16617f26.14ced1"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "a9f97b00.57d658",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Convert XML to JavaScript object",
|
||||
"info": "XML node can convert XML string to JavaScript object.",
|
||||
"x": 240,
|
||||
"y": 300,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "2d0dde7e.a50082",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 690,
|
||||
"y": 360,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "16617f26.14ced1",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "XML string",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "html",
|
||||
"syntax": "plain",
|
||||
"template": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<fruit id=\"100\">\n <kind>Apple</kind>\n <price>100</price>\n <origin>Canada</origin>\n</fruit>",
|
||||
"output": "str",
|
||||
"x": 370,
|
||||
"y": 360,
|
||||
"wires": [
|
||||
[
|
||||
"93e423a9.a407d"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
@@ -0,0 +1,119 @@
|
||||
[
|
||||
{
|
||||
"id": "581bd648.636628",
|
||||
"type": "xml",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"property": "payload",
|
||||
"attr": "",
|
||||
"chr": "",
|
||||
"x": 710,
|
||||
"y": 540,
|
||||
"wires": [
|
||||
[
|
||||
"b74237dc.1e5028"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "d0899f9b.f1ac6",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 200,
|
||||
"y": 540,
|
||||
"wires": [
|
||||
[
|
||||
"f04ffb9a.68edb8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "8a214c05.dc61f",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Control conversion using options property",
|
||||
"info": "XML node can control conversion by setting `options` property (defined by [xml2js](https://github.com/Leonidas-from-XIV/node-xml2js/blob/master/README.md#options)) in input message.",
|
||||
"x": 260,
|
||||
"y": 480,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "b74237dc.1e5028",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 870,
|
||||
"y": 540,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "f04ffb9a.68edb8",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "XML string",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "html",
|
||||
"syntax": "plain",
|
||||
"template": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<fruit id=\"100\">\n <kind>Apple</kind>\n <price>100</price>\n <origin>Canada</origin>\n</fruit>",
|
||||
"output": "str",
|
||||
"x": 370,
|
||||
"y": 540,
|
||||
"wires": [
|
||||
[
|
||||
"fedf79.5889c088"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "fedf79.5889c088",
|
||||
"type": "change",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "set options",
|
||||
"rules": [
|
||||
{
|
||||
"t": "set",
|
||||
"p": "options",
|
||||
"pt": "msg",
|
||||
"to": "{\"explicitArray\":false}",
|
||||
"tot": "json"
|
||||
}
|
||||
],
|
||||
"action": "",
|
||||
"property": "",
|
||||
"from": "",
|
||||
"to": "",
|
||||
"reg": false,
|
||||
"x": 550,
|
||||
"y": 540,
|
||||
"wires": [
|
||||
[
|
||||
"581bd648.636628"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
@@ -0,0 +1,90 @@
|
||||
[
|
||||
{
|
||||
"id": "84222b92.d65d18",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 200,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"cdd1c154.3a655"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7b014430.dfd94c",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Convert JavaScript object to YAML",
|
||||
"info": "YAML node can convert JavaScript object to YAML string.",
|
||||
"x": 240,
|
||||
"y": 120,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "1cd4ad02.9a5423",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 670,
|
||||
"y": 180,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "cdd1c154.3a655",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "JS object",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "json",
|
||||
"syntax": "plain",
|
||||
"template": "{\n \"fruits\" : {\n \"kind\": \"Apple\",\n \"price\": 100,\n \"origin\": \"Canada\"\n }\n}",
|
||||
"output": "json",
|
||||
"x": 360,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"aaf0100b.16628"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "aaf0100b.16628",
|
||||
"type": "yaml",
|
||||
"z": "4b63452d.672afc",
|
||||
"property": "payload",
|
||||
"name": "",
|
||||
"x": 510,
|
||||
"y": 180,
|
||||
"wires": [
|
||||
[
|
||||
"1cd4ad02.9a5423"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
@@ -0,0 +1,90 @@
|
||||
[
|
||||
{
|
||||
"id": "ba1dab90.8d1da8",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 200,
|
||||
"y": 360,
|
||||
"wires": [
|
||||
[
|
||||
"16617f26.14ced1"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "a9f97b00.57d658",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Convert YAML to JavaScript object",
|
||||
"info": "YAML node can convert YAML string to JavaScript object.",
|
||||
"x": 240,
|
||||
"y": 300,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "2d0dde7e.a50082",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 690,
|
||||
"y": 360,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "16617f26.14ced1",
|
||||
"type": "template",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "YAML string",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "yaml",
|
||||
"syntax": "plain",
|
||||
"template": "fruits:\n kind: Apple\n price: 100\n origin: Canada",
|
||||
"output": "str",
|
||||
"x": 370,
|
||||
"y": 360,
|
||||
"wires": [
|
||||
[
|
||||
"e2e4f862.f9d7d8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "e2e4f862.f9d7d8",
|
||||
"type": "yaml",
|
||||
"z": "4b63452d.672afc",
|
||||
"property": "payload",
|
||||
"name": "",
|
||||
"x": 530,
|
||||
"y": 360,
|
||||
"wires": [
|
||||
[
|
||||
"2d0dde7e.a50082"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
113
packages/node_modules/@node-red/nodes/examples/storage/file-in/01 - Read string from a file.json
vendored
Normal file
113
packages/node_modules/@node-red/nodes/examples/storage/file-in/01 - Read string from a file.json
vendored
Normal file
@@ -0,0 +1,113 @@
|
||||
[
|
||||
{
|
||||
"id": "84222b92.d65d18",
|
||||
"type": "inject",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "Hello, World!",
|
||||
"payloadType": "str",
|
||||
"x": 230,
|
||||
"y": 220,
|
||||
"wires": [
|
||||
[
|
||||
"b4b9f603.739598"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7b014430.dfd94c",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "Write string to a file, then read from the file",
|
||||
"info": "File-in node can read string from a file.",
|
||||
"x": 260,
|
||||
"y": 140,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "b4b9f603.739598",
|
||||
"type": "file",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"appendNewline": true,
|
||||
"createDir": false,
|
||||
"overwriteFile": "true",
|
||||
"encoding": "none",
|
||||
"x": 420,
|
||||
"y": 220,
|
||||
"wires": [
|
||||
[
|
||||
"6dc01cac.5c4bf4"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "2587adb9.7e60f2",
|
||||
"type": "debug",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 810,
|
||||
"y": 220,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "6dc01cac.5c4bf4",
|
||||
"type": "file in",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"format": "utf8",
|
||||
"chunk": false,
|
||||
"sendError": false,
|
||||
"encoding": "none",
|
||||
"x": 620,
|
||||
"y": 220,
|
||||
"wires": [
|
||||
[
|
||||
"2587adb9.7e60f2"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "f4b4309a.3b78a",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "↑read result from file",
|
||||
"info": "",
|
||||
"x": 630,
|
||||
"y": 260,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "672d3693.3cabd8",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "↓write to /tmp/hello.txt",
|
||||
"info": "",
|
||||
"x": 440,
|
||||
"y": 180,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,113 @@
|
||||
[
|
||||
{
|
||||
"id": "8997398f.c5d628",
|
||||
"type": "inject",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "😀",
|
||||
"payloadType": "str",
|
||||
"x": 210,
|
||||
"y": 480,
|
||||
"wires": [
|
||||
[
|
||||
"56e32d23.050f44"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "4e598e65.1799d",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "Read data in specified encoding",
|
||||
"info": "File-in node can specify encoding of data read from a file.",
|
||||
"x": 230,
|
||||
"y": 400,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "56e32d23.050f44",
|
||||
"type": "file",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"appendNewline": true,
|
||||
"createDir": false,
|
||||
"overwriteFile": "true",
|
||||
"encoding": "none",
|
||||
"x": 380,
|
||||
"y": 480,
|
||||
"wires": [
|
||||
[
|
||||
"38fa0579.f2cd8a"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "d28c8994.99c0a8",
|
||||
"type": "debug",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 770,
|
||||
"y": 480,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "38fa0579.f2cd8a",
|
||||
"type": "file in",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"format": "utf8",
|
||||
"chunk": false,
|
||||
"sendError": false,
|
||||
"encoding": "base64",
|
||||
"x": 580,
|
||||
"y": 480,
|
||||
"wires": [
|
||||
[
|
||||
"d28c8994.99c0a8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "fa22ca20.ae4528",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "↑read data from file as base64 string",
|
||||
"info": "",
|
||||
"x": 640,
|
||||
"y": 520,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "148e25ad.98891a",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "↓write to /tmp/hello.txt",
|
||||
"info": "",
|
||||
"x": 400,
|
||||
"y": 440,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,132 @@
|
||||
[
|
||||
{
|
||||
"id": "6a0b1d03.d4cee4",
|
||||
"type": "inject",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 220,
|
||||
"y": 740,
|
||||
"wires": [
|
||||
[
|
||||
"d4b00cb7.a5a23"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "f17ea1d1.8ecc3",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "Read data breaking lines into individual messages",
|
||||
"info": "File-in node can break read text into messages with individual lines",
|
||||
"x": 290,
|
||||
"y": 660,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "99ae7806.1d6428",
|
||||
"type": "file",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"appendNewline": true,
|
||||
"createDir": false,
|
||||
"overwriteFile": "true",
|
||||
"encoding": "none",
|
||||
"x": 540,
|
||||
"y": 740,
|
||||
"wires": [
|
||||
[
|
||||
"70d7892f.d27db8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7ed8282c.92b338",
|
||||
"type": "debug",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 810,
|
||||
"y": 800,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "70d7892f.d27db8",
|
||||
"type": "file in",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"format": "lines",
|
||||
"chunk": false,
|
||||
"sendError": false,
|
||||
"encoding": "none",
|
||||
"x": 620,
|
||||
"y": 800,
|
||||
"wires": [
|
||||
[
|
||||
"7ed8282c.92b338"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "c1b7e05.1d94b2",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "↑read data from file breaking lines into messages",
|
||||
"info": "",
|
||||
"x": 720,
|
||||
"y": 840,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "a5f647b2.cf27a8",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "↓write to /tmp/hello.txt",
|
||||
"info": "",
|
||||
"x": 560,
|
||||
"y": 700,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "d4b00cb7.a5a23",
|
||||
"type": "template",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "data",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "handlebars",
|
||||
"syntax": "plain",
|
||||
"template": "one\ntwo\nthree!",
|
||||
"output": "str",
|
||||
"x": 370,
|
||||
"y": 740,
|
||||
"wires": [
|
||||
[
|
||||
"99ae7806.1d6428"
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
201
packages/node_modules/@node-red/nodes/examples/storage/file-in/04 - Create a message stream.json
vendored
Normal file
201
packages/node_modules/@node-red/nodes/examples/storage/file-in/04 - Create a message stream.json
vendored
Normal file
@@ -0,0 +1,201 @@
|
||||
[
|
||||
{
|
||||
"id": "bdd57acc.2edc48",
|
||||
"type": "inject",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 220,
|
||||
"y": 1040,
|
||||
"wires": [
|
||||
[
|
||||
"7a069b01.0c2324"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "1fd12220.33953e",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "Creating a message stream from lines of data",
|
||||
"info": "File-in node can break read text into messages with individual lines. The messages creates a stream of messages.",
|
||||
"x": 270,
|
||||
"y": 960,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "ab6eb213.2a08d",
|
||||
"type": "file",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"appendNewline": true,
|
||||
"createDir": false,
|
||||
"overwriteFile": "true",
|
||||
"encoding": "none",
|
||||
"x": 540,
|
||||
"y": 1040,
|
||||
"wires": [
|
||||
[
|
||||
"b7ed49b0.649fb8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "c48d8ae0.9ff3a8",
|
||||
"type": "debug",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 810,
|
||||
"y": 1140,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "b7ed49b0.649fb8",
|
||||
"type": "file in",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"format": "lines",
|
||||
"chunk": false,
|
||||
"sendError": false,
|
||||
"encoding": "none",
|
||||
"x": 280,
|
||||
"y": 1140,
|
||||
"wires": [
|
||||
[
|
||||
"83073ebe.fcce4"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "3c33e69f.6a04ba",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "↑read data from file breaking lines into messages",
|
||||
"info": "",
|
||||
"x": 380,
|
||||
"y": 1180,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "3598bf7d.5712a",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "↓write to /tmp/hello.txt",
|
||||
"info": "",
|
||||
"x": 560,
|
||||
"y": 1000,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "7a069b01.0c2324",
|
||||
"type": "template",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "data",
|
||||
"field": "payload",
|
||||
"fieldType": "msg",
|
||||
"format": "handlebars",
|
||||
"syntax": "plain",
|
||||
"template": "Apple\nBanana\nGrape\nOrange",
|
||||
"output": "str",
|
||||
"x": 370,
|
||||
"y": 1040,
|
||||
"wires": [
|
||||
[
|
||||
"ab6eb213.2a08d"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "8d4ed1d0.821fe",
|
||||
"type": "join",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "",
|
||||
"mode": "auto",
|
||||
"build": "string",
|
||||
"property": "payload",
|
||||
"propertyType": "msg",
|
||||
"key": "topic",
|
||||
"joiner": "\\n",
|
||||
"joinerType": "str",
|
||||
"accumulate": "false",
|
||||
"timeout": "",
|
||||
"count": "",
|
||||
"reduceRight": false,
|
||||
"x": 630,
|
||||
"y": 1140,
|
||||
"wires": [
|
||||
[
|
||||
"c48d8ae0.9ff3a8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "83073ebe.fcce4",
|
||||
"type": "switch",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "< D",
|
||||
"property": "payload",
|
||||
"propertyType": "msg",
|
||||
"rules": [
|
||||
{
|
||||
"t": "lt",
|
||||
"v": "D",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"checkall": "true",
|
||||
"repair": true,
|
||||
"outputs": 1,
|
||||
"x": 470,
|
||||
"y": 1140,
|
||||
"wires": [
|
||||
[
|
||||
"8d4ed1d0.821fe"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "2088e195.f7aebe",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "↓filter data before \"D\"",
|
||||
"info": "",
|
||||
"x": 520,
|
||||
"y": 1100,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "b848cdc7.61e06",
|
||||
"type": "comment",
|
||||
"z": "194a3e4f.a92772",
|
||||
"name": "↑join to single string",
|
||||
"info": "",
|
||||
"x": 670,
|
||||
"y": 1180,
|
||||
"wires": []
|
||||
}
|
||||
]
|
113
packages/node_modules/@node-red/nodes/examples/storage/file/01 - Write string to a file.json
vendored
Normal file
113
packages/node_modules/@node-red/nodes/examples/storage/file/01 - Write string to a file.json
vendored
Normal file
@@ -0,0 +1,113 @@
|
||||
[
|
||||
{
|
||||
"id": "84222b92.d65d18",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "Hello, World!",
|
||||
"payloadType": "str",
|
||||
"x": 230,
|
||||
"y": 200,
|
||||
"wires": [
|
||||
[
|
||||
"b4b9f603.739598"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7b014430.dfd94c",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Write string to a file, then read from the file",
|
||||
"info": "File node can write string to a file.",
|
||||
"x": 260,
|
||||
"y": 120,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "b4b9f603.739598",
|
||||
"type": "file",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"appendNewline": true,
|
||||
"createDir": false,
|
||||
"overwriteFile": "true",
|
||||
"encoding": "none",
|
||||
"x": 420,
|
||||
"y": 200,
|
||||
"wires": [
|
||||
[
|
||||
"6dc01cac.5c4bf4"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "2587adb9.7e60f2",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 810,
|
||||
"y": 200,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "6dc01cac.5c4bf4",
|
||||
"type": "file in",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"format": "utf8",
|
||||
"chunk": false,
|
||||
"sendError": false,
|
||||
"encoding": "none",
|
||||
"x": 620,
|
||||
"y": 200,
|
||||
"wires": [
|
||||
[
|
||||
"2587adb9.7e60f2"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "f4b4309a.3b78a",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "↑read result from file",
|
||||
"info": "",
|
||||
"x": 630,
|
||||
"y": 240,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "672d3693.3cabd8",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "↓write to /tmp/hello.txt",
|
||||
"info": "",
|
||||
"x": 440,
|
||||
"y": 160,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,118 @@
|
||||
[
|
||||
{
|
||||
"id": "704479e1.399388",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "filename",
|
||||
"v": "/tmp/hello.txt",
|
||||
"vt": "str"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "Hello, World!",
|
||||
"payloadType": "str",
|
||||
"x": 230,
|
||||
"y": 400,
|
||||
"wires": [
|
||||
[
|
||||
"402f3b7e.988014"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "8e876a75.e9beb8",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Write string to a file specied by filename property, the read from the file",
|
||||
"info": "File node can target file using `filename` property.",
|
||||
"x": 350,
|
||||
"y": 320,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "402f3b7e.988014",
|
||||
"type": "file",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"filename": "",
|
||||
"appendNewline": true,
|
||||
"createDir": false,
|
||||
"overwriteFile": "true",
|
||||
"encoding": "none",
|
||||
"x": 390,
|
||||
"y": 400,
|
||||
"wires": [
|
||||
[
|
||||
"26e077d6.bbcd98"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "97b6b6b2.a54b38",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 770,
|
||||
"y": 400,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "26e077d6.bbcd98",
|
||||
"type": "file in",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"format": "utf8",
|
||||
"chunk": false,
|
||||
"sendError": false,
|
||||
"encoding": "none",
|
||||
"x": 580,
|
||||
"y": 400,
|
||||
"wires": [
|
||||
[
|
||||
"97b6b6b2.a54b38"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "85062297.da79",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "↑read result from file",
|
||||
"info": "",
|
||||
"x": 590,
|
||||
"y": 440,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "7316c4fc.b1dcdc",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "↓write to file specified by filename property",
|
||||
"info": "",
|
||||
"x": 500,
|
||||
"y": 360,
|
||||
"wires": []
|
||||
}
|
||||
]
|
85
packages/node_modules/@node-red/nodes/examples/storage/file/03 - Delete a file.json
vendored
Normal file
85
packages/node_modules/@node-red/nodes/examples/storage/file/03 - Delete a file.json
vendored
Normal file
@@ -0,0 +1,85 @@
|
||||
[
|
||||
{
|
||||
"id": "4ac00fb0.d5f52",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "",
|
||||
"payloadType": "date",
|
||||
"x": 220,
|
||||
"y": 600,
|
||||
"wires": [
|
||||
[
|
||||
"542cc2f4.92857c"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "671f8295.0e6f6c",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Delete a file",
|
||||
"info": "File node can delete a file.",
|
||||
"x": 170,
|
||||
"y": 540,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "542cc2f4.92857c",
|
||||
"type": "file",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"appendNewline": true,
|
||||
"createDir": false,
|
||||
"overwriteFile": "delete",
|
||||
"encoding": "none",
|
||||
"x": 420,
|
||||
"y": 600,
|
||||
"wires": [
|
||||
[
|
||||
"a24da523.5babe8"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "a24da523.5babe8",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 630,
|
||||
"y": 600,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "51157051.2f62",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "↓delete a file",
|
||||
"info": "",
|
||||
"x": 390,
|
||||
"y": 560,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -0,0 +1,113 @@
|
||||
[
|
||||
{
|
||||
"id": "e4ef1f5e.7cd82",
|
||||
"type": "inject",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "8J+YgA==",
|
||||
"payloadType": "str",
|
||||
"x": 220,
|
||||
"y": 820,
|
||||
"wires": [
|
||||
[
|
||||
"72b37cc8.177054"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "f5997af4.5a9298",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "Specify encoding of written data",
|
||||
"info": "File node can specify encoding of data.",
|
||||
"x": 230,
|
||||
"y": 740,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "72b37cc8.177054",
|
||||
"type": "file",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"appendNewline": true,
|
||||
"createDir": false,
|
||||
"overwriteFile": "true",
|
||||
"encoding": "base64",
|
||||
"x": 400,
|
||||
"y": 820,
|
||||
"wires": [
|
||||
[
|
||||
"2da33ec.f45cac2"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "2e814354.278c8c",
|
||||
"type": "debug",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 790,
|
||||
"y": 820,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "2da33ec.f45cac2",
|
||||
"type": "file in",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"format": "utf8",
|
||||
"chunk": false,
|
||||
"sendError": false,
|
||||
"encoding": "none",
|
||||
"x": 600,
|
||||
"y": 820,
|
||||
"wires": [
|
||||
[
|
||||
"2e814354.278c8c"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ec754c99.84bfd",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "↓write string with base64 encoding",
|
||||
"info": "",
|
||||
"x": 460,
|
||||
"y": 780,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "3e6704ff.4ce25c",
|
||||
"type": "comment",
|
||||
"z": "4b63452d.672afc",
|
||||
"name": "↑read result from file",
|
||||
"info": "",
|
||||
"x": 610,
|
||||
"y": 860,
|
||||
"wires": []
|
||||
}
|
||||
]
|
108
packages/node_modules/@node-red/nodes/examples/storage/watch/01 - Watch change of a file.json
vendored
Normal file
108
packages/node_modules/@node-red/nodes/examples/storage/watch/01 - Watch change of a file.json
vendored
Normal file
@@ -0,0 +1,108 @@
|
||||
[
|
||||
{
|
||||
"id": "84222b92.d65d18",
|
||||
"type": "inject",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "Hello, World!",
|
||||
"payloadType": "str",
|
||||
"x": 230,
|
||||
"y": 160,
|
||||
"wires": [
|
||||
[
|
||||
"b4b9f603.739598"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7b014430.dfd94c",
|
||||
"type": "comment",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "Watch changes of a file",
|
||||
"info": "Watch node can watch and report changes of a file.",
|
||||
"x": 200,
|
||||
"y": 80,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "b4b9f603.739598",
|
||||
"type": "file",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "",
|
||||
"filename": "/tmp/hello.txt",
|
||||
"appendNewline": true,
|
||||
"createDir": false,
|
||||
"overwriteFile": "true",
|
||||
"encoding": "none",
|
||||
"x": 420,
|
||||
"y": 160,
|
||||
"wires": [
|
||||
[]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "672d3693.3cabd8",
|
||||
"type": "comment",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "↓write to /tmp/hello.txt",
|
||||
"info": "",
|
||||
"x": 440,
|
||||
"y": 120,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "15f1f5aa.506ffa",
|
||||
"type": "watch",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "",
|
||||
"files": "/tmp/hello.txt",
|
||||
"recursive": "",
|
||||
"x": 410,
|
||||
"y": 200,
|
||||
"wires": [
|
||||
[
|
||||
"a91562b9.ca805"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "a91562b9.ca805",
|
||||
"type": "debug",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 610,
|
||||
"y": 200,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "2ab4eba8.267d64",
|
||||
"type": "comment",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "↑watch changes of /tmp/hello.txt",
|
||||
"info": "",
|
||||
"x": 470,
|
||||
"y": 240,
|
||||
"wires": []
|
||||
}
|
||||
]
|
163
packages/node_modules/@node-red/nodes/examples/storage/watch/02 - Watch change in a directory.json
vendored
Normal file
163
packages/node_modules/@node-red/nodes/examples/storage/watch/02 - Watch change in a directory.json
vendored
Normal file
@@ -0,0 +1,163 @@
|
||||
[
|
||||
{
|
||||
"id": "acec9dcc.eca82",
|
||||
"type": "inject",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "Hello, World!",
|
||||
"payloadType": "str",
|
||||
"x": 230,
|
||||
"y": 460,
|
||||
"wires": [
|
||||
[
|
||||
"137d60e2.0e267f"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cf011d1e.8afa6",
|
||||
"type": "comment",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "Watch changes in a directory",
|
||||
"info": "Watch node can watch and report changes in a directory",
|
||||
"x": 220,
|
||||
"y": 340,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "137d60e2.0e267f",
|
||||
"type": "file",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "",
|
||||
"filename": "/tmp/HG/hello.txt",
|
||||
"appendNewline": true,
|
||||
"createDir": false,
|
||||
"overwriteFile": "true",
|
||||
"encoding": "none",
|
||||
"x": 430,
|
||||
"y": 460,
|
||||
"wires": [
|
||||
[]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "9dfce283.63e5a",
|
||||
"type": "comment",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "↓write to /tmp/HG/*",
|
||||
"info": "",
|
||||
"x": 430,
|
||||
"y": 420,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "cbfb788b.297f98",
|
||||
"type": "watch",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "",
|
||||
"files": "/tmp/HG",
|
||||
"recursive": false,
|
||||
"x": 400,
|
||||
"y": 540,
|
||||
"wires": [
|
||||
[
|
||||
"3c691cd5.a0f2b4"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "3c691cd5.a0f2b4",
|
||||
"type": "debug",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "false",
|
||||
"statusVal": "",
|
||||
"statusType": "auto",
|
||||
"x": 550,
|
||||
"y": 540,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "c0d7ca6e.cad418",
|
||||
"type": "comment",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "↑watch changes in /tmp/HG",
|
||||
"info": "",
|
||||
"x": 460,
|
||||
"y": 580,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "a04e5231.5a2e1",
|
||||
"type": "inject",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "",
|
||||
"props": [
|
||||
{
|
||||
"p": "payload"
|
||||
},
|
||||
{
|
||||
"p": "topic",
|
||||
"vt": "str"
|
||||
}
|
||||
],
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": 0.1,
|
||||
"topic": "",
|
||||
"payload": "Goodbye, World!",
|
||||
"payloadType": "str",
|
||||
"x": 240,
|
||||
"y": 500,
|
||||
"wires": [
|
||||
[
|
||||
"655d7bab.cda6f4"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "655d7bab.cda6f4",
|
||||
"type": "file",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "",
|
||||
"filename": "/tmp/HG/goodbye.txt",
|
||||
"appendNewline": true,
|
||||
"createDir": false,
|
||||
"overwriteFile": "true",
|
||||
"encoding": "none",
|
||||
"x": 440,
|
||||
"y": 500,
|
||||
"wires": [
|
||||
[]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "f3b42209.a7673",
|
||||
"type": "comment",
|
||||
"z": "a7ac8a68.0f7218",
|
||||
"name": "Notice: Create /tmp/HG directory before deploying this example",
|
||||
"info": "",
|
||||
"x": 330,
|
||||
"y": 380,
|
||||
"wires": []
|
||||
}
|
||||
]
|
@@ -583,11 +583,11 @@
|
||||
"regex" : "Reguläre Ausdrücke verwenden"
|
||||
},
|
||||
"action" : {
|
||||
"set" : "Festlegen",
|
||||
"set" : "Setze",
|
||||
"change" : "Ändern",
|
||||
"delete" : "Löschen",
|
||||
"move" : "Bewegen",
|
||||
"to" : "bis",
|
||||
"to" : "auf",
|
||||
"search" : "Suchen nach",
|
||||
"replace" : "Ersetzen durch"
|
||||
},
|
||||
|
@@ -20,19 +20,18 @@
|
||||
<p>Es gibt drei Modi für die Erstellung von Nachrichtensequenzen:</p>
|
||||
<dl>
|
||||
<dt>Anzahl der Nachrichten</dt>
|
||||
<dd>Die Nachrichten werden zu Sequenzen einer bestimmten Länge gruppiert. Die Option <b>Überlappung</b>>
|
||||
<dd>Die Nachrichten werden zu Sequenzen einer bestimmten Länge gruppiert. Die Option <b>Überlappung</b>
|
||||
gibt an, wie viele Nachrichten vom Ende einer Sequenz am Anfang der nächsten Sequenz wiederholt werden sollen.</dd>
|
||||
|
||||
<dt>Zeitintervall</dt>
|
||||
<dd>Gruppiert Nachrichten, die innerhalb des angegebenen Intervalls eingehen. Wenn keine Nachrichten
|
||||
innerhalb des Intervalls ankommen, kann der Node optional eine leere Nachricht senden.</dd>
|
||||
|
||||
<dt>Sequenzesn verketten/dt>
|
||||
<dt>Sequenzen verketten/dt>
|
||||
<dd>Erzeugt eine Nachrichtensequenz durch die Verkettung eingehender Sequenzen. Jede Nachricht muss eine <code>msg.topic</code>
|
||||
und eine <code>msg.parts</code> Eigenschaft haben, um die Sequenz identifizieren zu können.
|
||||
Der Node ist mit einer Liste von <code>topic</code> konfiguriert,
|
||||
mit der die Reihnmefolge der Verkettung der Sequenzen definiert wird.
|
||||
</dd>
|
||||
mit der die Reihenfolge der Verkettung der Sequenzen definiert wird.</dd>
|
||||
|
||||
</dl>
|
||||
<h4>Speichern der Nachrichten</h4>
|
||||
|
@@ -37,9 +37,10 @@
|
||||
<h3>Details</h3>
|
||||
<p>The column template can contain an ordered list of column names. When converting CSV to an object, the column names
|
||||
will be used as the property names. Alternatively, the column names can be taken from the first row of the CSV.</p>
|
||||
<p>When converting to CSV, the column template is used to identify which properties to extract from the object and in what order.</p>
|
||||
<p>If the template is blank then the node can use a simple comma separated list of properties supplied in <code>msg.columns</code> to
|
||||
determine what to extract. If that is not present then all the object properties are output in the order in which the properties are found in the first row.</p>
|
||||
<p>When converting to CSV, the columns template is used to identify which properties to extract from the object and in what order.</p>
|
||||
<p>If the columns template is blank then you can use a simple comma separated list of properties supplied in <code>msg.columns</code> to
|
||||
determine what to extract and in what order. If neither are present then all the object properties are output in the order
|
||||
in which the properties are found in the first row.</p>
|
||||
<p>If the input is an array then the columns template is only used to optionally generate a row of column titles.</p>
|
||||
<p>If 'parse numerical values' option is checked, string numerical values will be returned as numbers, ie. middle value '1,"1.5",2'.</p>
|
||||
<p>If 'include empty strings' option is checked, empty strings will be returned in result, ie. middle value '"1","",3'.</p>
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
<script type="text/html" data-help-name="inject">
|
||||
<p>
|
||||
Запускает сообщение в поток вручную или через равные промежутки времени. Данные сообщения могут быть различных типов, включая строку, объект JavaScript или текущее время.
|
||||
Вбрасывает сообщение в поток вручную или через равные промежутки времени. Данные в сообщении могут быть различных типов, включая строку, объект JavaScript или метку текущего времени.
|
||||
</p>
|
||||
|
||||
<h3>Выводит</h3>
|
||||
@@ -29,26 +29,24 @@
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
Узел Inject может инициировать поток с определенными данными (значение payload). Данные по умолчанию - это отметка текущего времени в миллисекундах с 1 января 1970 года.
|
||||
Узел Inject может инициировать выполнение потока с определенными данными (значение payload). Данные по умолчанию - это метка текущего времени в миллисекундах, прошедших с 1 января 1970 года.
|
||||
</p>
|
||||
<p>
|
||||
Узел также поддерживает вывод строк, чисел, логических значений, объектов JavaScript или значений потоковых/глобальных контекстов.
|
||||
</p>
|
||||
<p>
|
||||
По умолчанию узел запускается вручную при нажатии на его кнопку в редакторе. Его также можно настроить для автоматического запуска через равные промежутки времени или по расписанию.
|
||||
По умолчанию узел запускается вручную при нажатии его кнопки в редакторе. Его также можно настроить на автоматический запуск через равные промежутки времени или по расписанию.
|
||||
</p>
|
||||
<p>
|
||||
Он также может быть настроен так, чтобы делать вывод один раз при каждом запуске потоков.
|
||||
Он также может быть настроен однократный вброс сообщения при каждом (пере)запуске потоков.
|
||||
</p>
|
||||
<p>
|
||||
Максимальный <i>интервал</i>, который можно указать, составляет около 596 часов / 24 дней. Однако если Вам нужны интервалы, превышающие один день, Вам следует рассмотреть возможность использования узла планировщика, который может работать с перебоями электроэнергии и перезапусками.
|
||||
Максимальный <i>интервал</i>, который можно указать, составляет около 596 часов / 24 дней. Однако если Вам нужны интервалы, превышающие один день, Вам следует рассмотреть возможность использования функций планировщика в узле, которые смогут корректно работать с перебоями электроэнергии и перезапусками.
|
||||
</p>
|
||||
<p>
|
||||
<b>Примечание</b>: В параметрах <i>"с интервалом в промежутке"</i> и <i>"в определенное время"</i> используется стандартная система cron.
|
||||
Это означает, что 20 минут будут в следующем часу, 20 минут спустя и 40 минут спустя - а не через 20 минут.
|
||||
Если нужно каждые 20 минут - используйте параметр <i>"с интервалом"</i>.
|
||||
<b>Примечание</b>: В параметрах <i>"с интервалом в промежутке"</i> и <i>"в определенное время"</i> используется стандартная система "cron". Это означает, что "20 минут" будут в следующем часу, 20 минут спустя и 40 минут спустя - а не через 20 минут. Если нужен вброс сообщений каждые 20 минут - используйте параметр <i>"с интервалом"</i>.
|
||||
</p>
|
||||
<p>
|
||||
<b>Примечание</b>: Чтобы включить многострочный текст в строковое значение, необходимо использовать узел Function для создания данных.
|
||||
<b>Примечание</b>: Чтобы включить многострочный текст в строковое значение, необходимо использовать узел Function для формирования данных.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -16,24 +16,24 @@
|
||||
|
||||
<script type="text/html" data-help-name="debug">
|
||||
<p>
|
||||
Отображает выбранные свойства сообщения на боковой панели во вкладке отладки и, при необходимости, журнале выполнения. По умолчанию отображается содержимое <code>msg.payload</code>, но его можно настроить для отображения любого свойства, полного сообщения или результата выражения JSONata.
|
||||
Отображает выбранные свойства получаемых узлом сообщения на боковой панели во вкладке отладки и, при необходимости, журнале среды выполнения. По умолчанию отображается содержимое <code>msg.payload</code>, но узел можно настроить на отображение любого свойства, всех свойств сообщения или результата выражения JSONata.
|
||||
</p>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
Вкладка отладки на боковой панели обеспечивает структурированное представление отправляемых сообщений, что упрощает понимание их структуры.
|
||||
Вкладка отладки на боковой панели обеспечивает структурированное представление полученных узлом сообщений, что упрощает исследование их структуры.
|
||||
</p>
|
||||
<p>
|
||||
Объекты и массивы JavaScript могут быть свернуты и развернуты по мере необходимости. Буферные объекты могут отображаться в виде сырых данных или как строка, когда это возможно.
|
||||
Объекты и массивы JavaScript могут быть свернуты и развернуты по мере необходимости. Буферы могут отображаться в виде данных как есть или в виде строки, когда это возможно.
|
||||
</p>
|
||||
<p>
|
||||
Рядом с каждым сообщением отладочная панель содержит информацию о времени получения сообщения, узле, который его отправил, и типе сообщения.
|
||||
Нажатие на идентификатор узла-источника, показывает этот узел в рабочей области.
|
||||
Рядом с каждым сообщением отладочная панель показывает информацию о времени получения сообщения, узле, который его отправил, и типе данных.
|
||||
Нажатие на идентификатор узла-источника покажет этот узел в рабочей области.
|
||||
</p>
|
||||
<p>
|
||||
Кнопка на узле может использоваться для включения или отключения его вывода. Рекомендуется отключать или удалять любые отладочные узлы, которые не используются.
|
||||
Кнопка на узле может использоваться для включения или отключения вывода информации о получаемых сообщениях. Рекомендуется отключать или удалять любые отладочные узлы, которые не используются.
|
||||
</p>
|
||||
<p>
|
||||
Узел также может быть сконфигурирован для отправки всех сообщений в журнал выполнения или для отправки короткого (32 символа) текста в статус под узлом отладки.
|
||||
Узел также может быть настроен на отправку всех сообщений в журнал выполнения или отправку короткого (32 символа) текста в статус под узлом.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
<script type="text/html" data-help-name="complete">
|
||||
<p>
|
||||
Запустить поток, когда другой узел завершит обработку сообщения.
|
||||
Инициирует запуск потока, когда другой узел завершает обработку сообщения.
|
||||
</p>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
@@ -24,12 +24,12 @@
|
||||
Если узел сообщает среде выполнения о завершении обработки сообщения, этот узел можно использовать для запуска второго потока.
|
||||
</p>
|
||||
<p>
|
||||
Например, это можно использовать вместе с узлом без выходного порта, таким как узел Email, для продолжения потока.
|
||||
Например, его можно использовать вместе с узлом, у которого нет выходного порта, таким как узел Email, для продолжения потока.
|
||||
</p>
|
||||
<p>
|
||||
Этот узел должен быть настроен для обработки события выбранных узлов в потоке. В отличие от узла Catch, он не предоставляет режим 'обрабатывать все' для автоматического применения ко всем узлам в потоке.
|
||||
Этот узел должен быть настроен на отслеживание событий выбранных узлов в потоке. В отличие от узла Catch, у него нет режима 'обрабатывать все' для автоматического применения ко всем узлам в потоке.
|
||||
</p>
|
||||
<p>
|
||||
Не все узлы будут инициировать это событие - это будет зависеть от того, была ли в них реализована поддержка этой функции, добавленной в Node-RED 1.0.
|
||||
Не все узлы могут инициировать запуск потока по завршению обработки сообщения. все зависит от того, была ли в них реализована поддержка этой функции, добавленной в Node-RED 1.0, или нет.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
<script type="text/html" data-help-name="catch">
|
||||
<p>
|
||||
Ловит ошибки, выдаваемые узлами на той же вкладке.
|
||||
Ловит ошибки, выбрасываемые узлами на той же вкладке.
|
||||
</p>
|
||||
|
||||
<h3>Выводит</h3>
|
||||
@@ -28,21 +28,21 @@
|
||||
<dt>error.source.type <span class="property-type">строка</span></dt>
|
||||
<dd>тип узла, выдавшего ошибку.</dd>
|
||||
<dt>error.source.name <span class="property-type">строка</span></dt>
|
||||
<dd>имя, если установлено, узла, выдавшего ошибку.</dd>
|
||||
<dd>имя узла, выдавшего ошибку, если было настроено.</dd>
|
||||
</dl>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
Если узел выдает ошибку во время обработки сообщения, поток обычно останавливается. Этот узел можно использовать для отлова этих ошибок и обработки их с помощью отдельного потока.
|
||||
Если узел выбрасывает ошибку во время обработки сообщения, поток обычно останавливается. Этот узел можно использовать для отлова и обработки таких ошибок с помощью отдельного потока.
|
||||
</p>
|
||||
<p>
|
||||
По умолчанию узел будет отлавливать ошибки, генерируемые любым узлом на той же вкладке. По желанию он может быть нацелен на определенные узлы или настроен на перехват только тех ошибок, которые не были еще перехвачены 'нацеленным' Catch узлом.
|
||||
По умолчанию узел будет отлавливать ошибки, генерируемые любым узлом на той же вкладке. По желанию он может быть нацелен на определенные узлы или настроен на перехват только тех ошибок, которые не были перехвачены 'нацеленным' Catch узлом.
|
||||
</p>
|
||||
<p>
|
||||
Когда выдается ошибка, все соответствующие Catch узлы получат сообщение.
|
||||
</p>
|
||||
<p>
|
||||
Если ошибка выдается в подпотоке, она будет обработана любыми Catch узлами внутри подпотока. Если таковых нет, ошибка будет распространена до вкладки, на которой находится экземпляр подпотока.
|
||||
Если ошибка выбрасывается в подпотоке, она будет обработана любыми Catch узлами внутри подпотока. Если таковых нет, ошибка будет распространена до вкладки, на которой находится экземпляр подпотока.
|
||||
</p>
|
||||
<p>
|
||||
Если сообщение уже имеет свойство <code>error</code>, оно копируется в <code>_error</code>.
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
<script type="text/html" data-help-name="status">
|
||||
<p>
|
||||
Сообщает о статусах других узлов на той же вкладке.
|
||||
Инициирует запуск потока при изменении статуса других узлов на той же вкладке.
|
||||
</p>
|
||||
|
||||
<h3>Выводит</h3>
|
||||
@@ -28,7 +28,7 @@
|
||||
<dt>status.source.id <span class="property-type">строка</span></dt>
|
||||
<dd>идентификатор узла, сообщившего о статусе.</dd>
|
||||
<dt>status.source.name <span class="property-type">строка</span></dt>
|
||||
<dd>имя, если установлено, узла, сообщившего о статусе.</dd>
|
||||
<dd>имя узла, сообщившего о статусе, если настроено.</dd>
|
||||
</dl>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
@@ -36,6 +36,6 @@
|
||||
Этот узел не создает <code>payload</code> данные.
|
||||
</p>
|
||||
<p>
|
||||
По умолчанию узел сообщает о статусах всех узлов на той же вкладке в рабочей области. Его можно настроить для выборочного отчета о статусе отдельных узлов.
|
||||
По умолчанию узел сообщает о статусах всех узлов на той же вкладке в рабочей области. Его можно настроить на выборочное отслеживание статуса только отдельных узлов.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -21,13 +21,13 @@
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
Этот узел может быть подключен к любому узлу <code>link out</code> на любой вкладке. После подключения они ведут себя так, как если бы они были соединены вместе обычным проводом.
|
||||
Этот узел может быть подключен к любому <code>link out</code> узлу на любой вкладке. После подключения они ведут себя так, как если бы они были соединены вместе обычным проводом.
|
||||
</p>
|
||||
<p>
|
||||
Связи между link-узлами отображаются, только когда выбран link-узел. Если есть какие-либо провода к другим вкладкам, отображается виртуальный узел, по которому можно кликнуть, чтобы перейти на соответствующую вкладку.
|
||||
Связи между link-узлами отображаются, только когда выбран один из соединенных link узлов. Если есть какие-либо провода, ведущие на другие вкладки, они отображаются в виде виртуального узла, по которому можно кликнуть, чтобы перейти на соответствующую вкладку.
|
||||
</p>
|
||||
<p>
|
||||
<b>Примечание:</b> Связи не могут идти внутрь подпотока или изнутри подпотока наружу.
|
||||
<b>Примечание:</b> Провод не может вести внутрь подпотока или изнутри подпотока наружу.
|
||||
</p>
|
||||
</script>
|
||||
|
||||
@@ -38,12 +38,12 @@
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
Узел может быть подключен к любому узлу <code>link in</code> на любой вкладке. После подключения они ведут себя так, как если бы они были соединены вместе обычным проводом.
|
||||
Узел может быть подключен к любому <code>link in</code> узлу на любой вкладке. После подключения они ведут себя так, как если бы они были соединены вместе обычным проводом.
|
||||
</p>
|
||||
<p>
|
||||
Связи между link-узлами отображаются, только когда выбран link-узел. Если есть какие-либо провода к другим вкладкам, отображается виртуальный узел, по которому можно кликнуть, чтобы перейти на соответствующую вкладку.
|
||||
Связи между link-узлами отображаются, только когда выбран один из соединенных link узлов. Если есть какие-либо провода, ведущие на другие вкладки, они отображаются в виде виртуального узла, по которому можно кликнуть, чтобы перейти на соответствующую вкладку.
|
||||
</p>
|
||||
<p>
|
||||
<b>Примечание:</b> Связи не могут идти внутрь подпотока или изнутри подпотока наружу.
|
||||
<b>Примечание:</b> Провод не может вести внутрь подпотока или изнутри подпотока наружу.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -16,11 +16,11 @@
|
||||
|
||||
<script type="text/html" data-help-name="comment">
|
||||
<p>
|
||||
Узел, который Вы можете использовать для добавления комментариев к Вашим потокам.
|
||||
Узел, который можно использовать для добавления комментариев к вашим потокам.
|
||||
</p>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
Панель редактирования поддерживает синтаксис Markdown. Текст будет отображен как 'описание' на этой информационной вкладке.
|
||||
Окно редактирования поддерживает синтаксис Markdown. Текст будет отображен на информационной вкладке боковой панели в секции 'описание'.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -16,22 +16,22 @@
|
||||
|
||||
<script type="text/html" data-help-name="unknown">
|
||||
<p>
|
||||
Тип этого узла неизвестен Вашему Node-RED.
|
||||
Тип этого узла неизвестен вашему Node-RED.
|
||||
</p>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
<i>
|
||||
Если Вы развернете узел в этом состоянии, его конфигурация будет сохранена, но поток не будет запущен, пока не будет установлен отсутствующий тип.
|
||||
Если вы развернете узел в этом состоянии, его настройки будут сохранены, но поток не будет запущен до тех пор, пока не будет установлен отсутствующий тип.
|
||||
</i>
|
||||
</p>
|
||||
<p>
|
||||
Используйте опцию <code>Меню - Управление палитрой</code> для поиска и установки узлов или <b>npm install <модуль></b> для установки любых отсутствующих модулей и перезапустите Node-RED и повторно импортируйте узлы.
|
||||
Используйте опцию <code>Меню - Управление палитрой</code> для поиска и установки узлов или <b>npm install <модуль></b> для установки отсутствующих модулей. Затем перезапустите Node-RED и повторно импортируйте узлы.
|
||||
</p>
|
||||
<p>
|
||||
Возможно, этот тип узла уже установлен, но отсутствуют какие-то из его зависимостей. Проверьте журнал запуска Node-RED на наличие сообщений об ошибках, связанных с отсутствующим типом узла.
|
||||
Возможно, этот тип узла уже установлен, но отсутствуют какие-то из его зависимостей. Проверьте журнал выполнения Node-RED на наличие сообщений об ошибках, связанных с отсутствующим типом узла.
|
||||
</p>
|
||||
<p>
|
||||
В противном случае Вам следует связаться с автором потока, чтобы получить копию отсутствующего типа узла.
|
||||
В противном случае вам следует связаться с автором потока, чтобы получить отсутствующий тип узла.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -16,22 +16,22 @@
|
||||
|
||||
<script type="text/html" data-help-name="function">
|
||||
<p>
|
||||
Блок с JavaScript функцией, написанной во вкладке <b>Функция</b>, которая исполняется для сообщений, получаемых узлом.
|
||||
Исполняет JavaScript функцию (введенную в настройках, во вкладке <b>Функция</b>) для всех получаемых узлом сообщений.
|
||||
</p>
|
||||
<p>
|
||||
Сообщения передаются в виде объекта JavaScript с именем <code>msg</code>.
|
||||
</p>
|
||||
<p>
|
||||
Обычно он имеет свойство <code>msg.payload</code>, содержащее тело сообщения.
|
||||
Обычно у объекта есть свойство <code>msg.payload</code>, содержащее тело сообщения.
|
||||
</p>
|
||||
<p>
|
||||
Ожидается, что функция вернет объект сообщения (или несколько объектов сообщения), но может также ничего не возвращать, чтобы остановить поток.
|
||||
Ожидается, что функция вернет объект сообщения (или несколько объектов сообщения), которые будут отправлены следующим узлам в потоке, но может также ничего не возвращать, чтобы остановить поток.
|
||||
</p>
|
||||
<p>
|
||||
Код настройки, выполняемый один раз при запуске сервера или при развертывании новой конфигурации потока, можно указать во вкладке <b>Настройка</b>. Кроме того, код очистки, выполняемый при остановке или повторном развертывании узла, можно указать во вкладке <b>Закрытие</b>.
|
||||
Код настройки, выполняемый один раз при запуске сервера или при развертывании новой конфигурации потока, можно ввести во вкладке <b>Настройка</b>. Также во вкладке <b>Закрытие</b> можно ввести код очистки, выполняемый при остановке или повторном развертывании узла.
|
||||
</p>
|
||||
<p>
|
||||
Если код настройки возвращает объект Promise, обработка входящих сообщений узлом начнется после его завершения.
|
||||
Если код настройки возвращает Promise объект, тогда обработка входящих сообщений узлом начнется после его завершения.
|
||||
</p>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
@@ -47,8 +47,8 @@
|
||||
Она может вернуть/отправить:
|
||||
</p>
|
||||
<ul>
|
||||
<li>один объект сообщения - передается узлам, подключенным к первому выходу</li>
|
||||
<li>массив объектов сообщений - передается на узлы, подключенные к соответствующим выходам</li>
|
||||
<li>один объект сообщения - передается узлам, подключенным к первому порту выхода</li>
|
||||
<li>массив объектов сообщений - передается на узлы, подключенные к соответствующим портам выхода</li>
|
||||
</ul>
|
||||
<p>
|
||||
Примечание: код настройки выполняется во время инициализации узлов. Таким образом, если на вкладке настройки кода вызывается <code>node.send</code>, последующие узлы могут не получить это сообщение.
|
||||
@@ -70,13 +70,13 @@
|
||||
<li><code>node.error("Ошибка")</code></li>
|
||||
</ul>
|
||||
<p>
|
||||
Узел Catch также может использоваться для обработки ошибок. Чтобы узел Catch мог ловить сообщение об ошибке, передайте <code>msg</code> в качестве второго аргумента в <code>node.error</code>:
|
||||
Также узел Catch может использоваться для обработки ошибок. Чтобы можно было ловить оповещения об ошибке, при вызове <code>node.error</code> передайте <code>msg</code> в качестве второго аргумента:
|
||||
</p>
|
||||
<pre>node.error("Ошибка", msg);</pre>
|
||||
|
||||
<h4>Доступ к информации об узле</h4>
|
||||
<p>
|
||||
В функциональном блоке к идентификатору и имени узла можно обращаться, используя следующие свойства:
|
||||
В функции можно обращаться к идентификатору и имени узла, используя следующие свойства:
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>node.id</code> - идентификатор узла</li>
|
||||
|
@@ -16,18 +16,18 @@
|
||||
|
||||
<script type="text/html" data-help-name="switch">
|
||||
<p>
|
||||
Направляет сообщения по разным ветвям потока на основе значений свойств сообщения или его позиции в последовательности.
|
||||
Направляет сообщения по разным ветвям потока, в завсимости от значений свойств сообщения или его позиции в последовательности.
|
||||
</p>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
Когда приходит сообщение, узел выполняет проверку соответствия каждому из определенных правил и перенаправляет сообщение на их выходы.
|
||||
Когда приходит сообщение, узел выполняет проверку соответствия сообщения каждому из установленных правил и перенаправляет сообщение на соответствующие выходы.
|
||||
</p>
|
||||
<p>
|
||||
При желании узел может быть настроен на прекращение проверки правил, как только он найдет первое подходящее.
|
||||
При желании узел может быть настроен на прекращение проверки правил после того как найдено первое подходящее.
|
||||
</p>
|
||||
<p>
|
||||
Правила могут выполняться для отдельного свойства сообщения, свойства потокового или глобального контекста, переменной среды или результата выражения JSONata.
|
||||
Правила могут применяться к свойству сообщения, свойству потокового или глобального контекста, переменной среды или результату выражения JSONata.
|
||||
</p>
|
||||
|
||||
<h4>Правила</h4>
|
||||
@@ -35,8 +35,8 @@
|
||||
Существует четыре типа правил:
|
||||
</p>
|
||||
<ol>
|
||||
<li>Правила <b>value rules</b> сравниваются с указанным свойством</li>
|
||||
<li>Правила <b>sequence rules</b> могут применяться для последовательностей сообщений, таких как сгенерированные узлом Split</li>
|
||||
<li>Правила категории <b>value rules</b> сравнивают значение указанного свойства сообщения</li>
|
||||
<li>Правила категории <b>sequence rules</b> могут применяться для последовательностей сообщений, таких как сгенерированные узлом Split</li>
|
||||
<li><b>Выражение JSONata</b> исполняется для сообщения и считается подходящим, если оно возвращает истинное значение</li>
|
||||
<li>Правило <b>иначе</b> используется для сообщений, не подходящих ни под одно из предыдущих правил.</li>
|
||||
</ol>
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
<h4>Обработка последовательностей сообщений</h4>
|
||||
<p>
|
||||
По умолчанию узел не изменяет свойство <code>msg.parts</code> у сообщений, которые являются частью последовательности.
|
||||
По умолчанию узел не изменяет свойство <code>msg.parts</code> у сообщений, являющихся частью последовательности.
|
||||
</p>
|
||||
<p>
|
||||
Можно включить параметр <b>пересоздавать последовательности сообщений</b> для создания новых последовательностей сообщений для каждого соответствующего правила. В этом режиме узел будет помещать в буфер всю входящую последовательность перед отправкой новых последовательностей. Настройка <code>nodeMessageBufferMaxLength</code> может быть использована для ограничения количества сообщений в буфере.
|
||||
|
@@ -19,7 +19,7 @@
|
||||
Устанавливает, изменяет, удаляет или перемещает свойства сообщения, контекста потока или глобального контекста.
|
||||
</p>
|
||||
<p>
|
||||
В узле можно указать несколько правил, которые будут применяться в том порядке, в котором они определены.
|
||||
В узле можно указать несколько операций, которые будут применяться в том порядке, в котором они заданы.
|
||||
</p>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
@@ -28,13 +28,13 @@
|
||||
</p>
|
||||
<dl class="message-properties">
|
||||
<dt>Установить</dt>
|
||||
<dd>установить свойство. Значение может быть разных типов или может быть взято из существующего свойства сообщения или контекста.</dd>
|
||||
<dd>устанавливает свойство. Значение может быть различных типов или может быть взято из существующего свойства сообщения или контекста.</dd>
|
||||
<dt>Изменить</dt>
|
||||
<dd>найти & заменить части свойства. Если используется регулярное выражение, настройка "заменить на" может включать группы захвата, например <code>$1</code>. При полном совпадении заменяет только тип.</dd>
|
||||
<dd>ищет и заменяет части текста в свойстве сообщения. Если используется регулярное выражение, настройка "заменить на" может включать группы захвата, например <code>$1</code>. При полном совпадении заменяет только тип.</dd>
|
||||
<dt>Удалить</dt>
|
||||
<dd>удалить свойство.</dd>
|
||||
<dd>удаляет свойство.</dd>
|
||||
<dt>Переместить</dt>
|
||||
<dd>переместить или переименовать свойство.</dd>
|
||||
<dd>перемещает или переименовывает свойство.</dd>
|
||||
</dl>
|
||||
<p>
|
||||
Тип свойства "выражение" использует язык запросов и выражений <a href="http://jsonata.org/" target="_new">JSONata</a>.
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
<script type="text/html" data-help-name="range">
|
||||
<p>
|
||||
Соотносит значение одного числового диапазона к другому числовому диапазону.
|
||||
Соотносит значение одного числового диапазона с другим числовым диапазоном.
|
||||
</p>
|
||||
|
||||
<h3>Принимает</h3>
|
||||
@@ -28,7 +28,7 @@
|
||||
<h3>Выводит</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>payload <span class="property-type">число</span></dt>
|
||||
<dd>Значение, соотнесенное к новому диапазону.</dd>
|
||||
<dd>Значение, соотнесенное с новым диапазоном.</dd>
|
||||
</dl>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
@@ -42,7 +42,7 @@
|
||||
<i>Масштабировать и обернуть в целевой диапазон</i> означает, что результат будет обернут вокруг целевого диапазона:
|
||||
</p>
|
||||
<p>
|
||||
Например, для входа 0 - 10 сопоставленного с 0 - 100.
|
||||
Например, если входные 0 - 10 сопоставляются с 0 - 100:
|
||||
</p>
|
||||
<table style="outline-width:#888 solid thin">
|
||||
<tr><th width="80px">режим</th><th width="80px">вход</th><th width="80px">выход</th></tr>
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
<script type="text/html" data-help-name="template">
|
||||
<p>
|
||||
Устанавливает свойство на основе предоставленного шаблона.
|
||||
Генерирует текст по установленному шаблону и присваивает его выбранному свойству сообщения.
|
||||
</p>
|
||||
|
||||
<h3>Принимает</h3>
|
||||
@@ -24,23 +24,23 @@
|
||||
<dt>msg <span class="property-type">объект</span></dt>
|
||||
<dd>Объект сообщения msg, содержащий информацию для заполнения шаблона.</dd>
|
||||
<dt class="optional">шаблон <span class="property-type">строка</span></dt>
|
||||
<dd>Шаблон для заполнения данными из сообщения msg. Если шаблон не настроен на панели редактирования, тогда он может быть установлен через свойство msg.template.</dd>
|
||||
<dd>Шаблон текста для заполнения данными из сообщения msg. Если шаблон не введен на панели редактирования, тогда он может быть установлен через свойство msg.template.</dd>
|
||||
</dl>
|
||||
|
||||
<h3>Выводит</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>msg <span class="property-type">объект</span></dt>
|
||||
<dd>Сообщение msg, у которого выбранному свойству присвоено значение, сформированное заполнением шаблона свойствами из входящего сообщения.</dd>
|
||||
<dd>Сообщение msg, у которого выбранному свойству присвоено тексктовое значение, полученное после заполнения шаблона данными входящего сообщения.</dd>
|
||||
</dl>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
По умолчанию используется формат <i><a href="http://mustache.github.io/mustache.5.html" target="_blank">mustache</a></i>, но это может быть выключено при необходимости.
|
||||
По умолчанию используется формат <i><a href="http://mustache.github.io/mustache.5.html" target="_blank">mustache</a></i>. При необходимости это можно отключить.
|
||||
</p>
|
||||
<p>
|
||||
Например, когда шаблон:
|
||||
</p>
|
||||
<pre>Привет, {{payload.name}}. Сегодня {{date}}</pre>
|
||||
<pre>Привет, {{payload.name}}. Сегодня {{date}}.</pre>
|
||||
<p>
|
||||
получает сообщение msg, содержащее:
|
||||
</p>
|
||||
@@ -51,13 +51,13 @@
|
||||
}
|
||||
}</pre>
|
||||
<p>
|
||||
Результирующее свойство будет:
|
||||
Выбранному свойству будет присвоен текст:
|
||||
</p>
|
||||
<pre>Привет, Иван. Сегодня понедельник</pre>
|
||||
<pre>Привет, Иван. Сегодня понедельник.</pre>
|
||||
<p>
|
||||
Можно использовать свойство из контекста потока или глобального контекста. Просто используйте <code>{{flow.name}}</code> или <code>{{global.name}}</code>, или для постоянного хранилища <code>store</code> используйте <code>{{flow[store].name}}</code> или <code>{{global[store].name}}</code>.
|
||||
</p>
|
||||
<p>
|
||||
<b>Примечание:</b> по умолчанию <i>mustache</i> кодирует любые не алфавитно-цифровых или HTML-сущности в значениях, которые он подставляет, для безопасного использования в HTML. Чтобы предотвратить это, используйте тройные фигурные скобки <code>{{{triple}}}</code>.
|
||||
<b>Примечание:</b> по умолчанию <i>mustache</i> заменяет определенные символы их escape-кодами для безопасного использования в HTML. Чтобы это не происходило, вы можете использовать тройные фигурные скобки <code>{{{triple}}}</code>.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -21,20 +21,20 @@
|
||||
<h3>Принимает</h3>
|
||||
<dl class="message-properties">
|
||||
<dt class="optional">delay <span class="property-type">число</span></dt>
|
||||
<dd>Устанавливает задержку в миллисекундах, которая будет применена к сообщению. Этот параметр применяется только в том случае, если узел настроен на то, чтобы разрешать сообщению переопределять установленный интервал задержки по умолчанию.</dd>
|
||||
<dd>Устанавливает задержку в миллисекундах, которая будет применена к сообщению. Этот параметр применяется только в том случае, если узел настроен так, чтобы разрешать сообщению переопределять установленный интервал задержки по умолчанию.</dd>
|
||||
<dt class="optional">reset</dt>
|
||||
<dd>Если в полученном сообщении этому свойству присвоено какое-либо значение, все ожидающие сообщения, удерживаемые узлом, очищаются без дальнейшей отправки.</dd>
|
||||
<dd>Если в полученном сообщении этому свойству присвоено какое-либо значение, все ожидающие сообщения, удерживаемые узлом, сбрасываются без дальнейшей отправки.</dd>
|
||||
<dt class="optional">flush</dt>
|
||||
<dd>Если в полученном сообщении этому свойству присвоено какое-либо значение, все ожидающие сообщения, удерживаемые узлом, немедленно отправляются далее.</dd>
|
||||
</dl>
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
Когда настроено задерживать сообщения, интервал задержки может быть фиксированным значением, случайным значением в пределах диапазона или динамически установленным для каждого сообщения. Каждое сообщение задерживается независимо от любых других сообщений, основываясь на времени его прибытия.
|
||||
Когда узел настроен на задержку сообщений, интервал задержки может быть фиксированным значением, случайным значением в пределах диапазона или динамически установленным для каждого сообщения. Каждое сообщение задерживается независимо от любых других сообщений, основываясь на времени его прибытия в узел.
|
||||
</p>
|
||||
<p>
|
||||
Когда настроено ограничивать скорость сообщений, их доставка распределяется по настроенному периоду времени. Статус показывает количество сообщений, находящихся в данный момент в очереди. Если выбрано он может отбрасывать промежуточные сообщений по мере их поступления.
|
||||
Когда узел настроен на ограничение скорости сообщений, их доставка распределяется по установленному периоду времени. Статус показывает количество сообщений, находящихся в данный момент в очереди. При необходимости узел может быть настроен на отбрасывание промежуточных сообщений по мере их поступления.
|
||||
</p>
|
||||
<p>
|
||||
Ограничение скорости может применяться ко всем сообщениям или группировать их в соответствии со значением <code>msg.topic</code>. При группировании промежуточные сообщения автоматически отбрасываются. В каждом интервале времени узел может либо выпустить самое последнее сообщение для всех тем, либо выпустить самое последнее сообщение для следующей темы.
|
||||
Ограничение скорости может применяться ко всем сообщениям или группам сообщений в соответствии с их значением темы (<code>msg.topic</code>). При группировании промежуточные сообщения автоматически отбрасываются. В каждом интервале времени узел может либо выпустить самое последнее сообщение для всех тем, либо выпустить самое последнее сообщение для следующей темы.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
<script type="text/html" data-help-name="trigger">
|
||||
<p>
|
||||
При срабатывании может отправить сообщение, а затем дополнительно второе сообщение, если оно не продлено или не сброшено.
|
||||
При срабатывании может отправить сообщение, а затем дополнительно второе сообщение, если не было сделано продление или сброс.
|
||||
</p>
|
||||
|
||||
<h3>Принимает</h3>
|
||||
@@ -24,15 +24,15 @@
|
||||
<dt class="optional">delay <span class="property-type">число</span></dt>
|
||||
<dd>Устанавливает задержку в миллисекундах, которая будет применяться к сообщению. Этот параметр применяется только в том случае, если узел настроен так, чтобы сообщение могло отменять настроенный интервал задержки по умолчанию.</dd>
|
||||
<dt class="optional">reset</dt>
|
||||
<dd>Если сообщение получено с этим свойством, любой тайм-аут или повтор, находящийся в обработке в текущий момент, будет сброшен, и сообщение не сработает.</dd>
|
||||
<dd>При получении сообщения с этим свойством, любой тайм-аут или повтор, находящиеся в обработке в текущий момент, будут сброшены, а сообщение не сработает.</dd>
|
||||
</dl>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
Этот узел можно использовать для создания тайм-аута в потоке. По умолчанию, когда узел получает сообщение, он отправляет сообщение с <code>payload</code> равным <code>1</code>. Затем он ждет 250 мс, прежде чем отправить второе сообщение с <code>payload</code> равным <code>0</code>. Это можно использовать, например, для мигания светодиода, подключенного к выводу Raspberry Pi GPIO.
|
||||
Этот узел можно использовать для создания тайм-аута внутри потока. По умолчанию, когда узел получает сообщение, он отправляет сообщение с <code>payload</code> равным <code>1</code>. Затем он ждет 250 мс, прежде чем отправить второе сообщение с <code>payload</code> равным <code>0</code>. Это можно использовать, например, для мигания светодиодом, подключеным к выходу GPIO у Raspberry Pi.
|
||||
</p>
|
||||
<p>
|
||||
Данные каждого отправленного сообщения могут быть настроены на различные значения, включая возможность ничего не отправлять. Например, если установить начальное сообщение на <i>ничего</i> и выбрать опцию продления таймера с каждым новым сообщением, узел будет действовать как сторожевой таймер, отправляя сообщение только в том случае, если ничего не получено в течение установленного интервала.
|
||||
Данные каждого отправленного сообщения могут быть настроены на различные значения, включая возможность ничего не отправлять. Например, если установить первоначальное сообщение на <i>ничего</i> и выбрать опцию продления таймера с каждым новым сообщением, узел будет действовать как сторожевой таймер, отправляя сообщение только в том случае, если ничего не получено в течение установленного интервала.
|
||||
</p>
|
||||
<p>
|
||||
Если установлен тип <i>строка</i>, узел поддерживает синтаксис шаблона mustache.
|
||||
@@ -44,12 +44,12 @@
|
||||
Если узел получает сообщение со свойством <code>reset</code> или <code>payload</code>, который совпадает с настроенным в узле, любой тайм-аут или повтор, находящийся в обработке в текущий момент, будет сброшен, и сообщение не сработает.
|
||||
</p>
|
||||
<p>
|
||||
Узел может быть настроен на повторную отправку сообщения с регулярным интервалом, пока оно не будет сброшено полученным сообщением.
|
||||
Узел может быть настроен на повторную отправку сообщения с регулярным интервалом, пока не будет произведен сброс отправкой на него сообщения.
|
||||
</p>
|
||||
<p>
|
||||
При желании узел может быть настроен на обработку сообщений, как если бы они были отдельными потоками, используя свойство msg для идентификации каждого потока. По умолчанию <code>msg.topic</code>.
|
||||
</p>
|
||||
<p>
|
||||
Статус показывает, что узел в данный момент активен. Если используется несколько потоков, статус показывает количество удерживаемых потоков.
|
||||
Статус показывает - активен ли узел в данный момент. Если работает в многопоточном режиме, статус показывает количество удерживаемых потоков.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -19,16 +19,16 @@
|
||||
Запускает системную команду и возвращает ее вывод.
|
||||
</p>
|
||||
<p>
|
||||
Узел может быть настроен либо на ожидание завершения команды, либо на отправку своих выходных данных, пока команда их генерирует.
|
||||
Узел может быть настроен либо на ожидание завершения выполнения команды, либо на отправку выходных данных по мере их генерации в ходе выполнения.
|
||||
</p>
|
||||
<p>
|
||||
Выполняемая команда может быть настроена в узле или предоставлена полученным сообщением.
|
||||
Выполняемая команда может быть установлена в настройках узла или полученным сообщением.
|
||||
</p>
|
||||
|
||||
<h3>Принимает</h3>
|
||||
<dl class="message-properties">
|
||||
<dt class="optional">payload <span class="property-type">строка</span></dt>
|
||||
<dd>будет добавлено к выполненной команде, если настроено так делать.</dd>
|
||||
<dd>будет добавлено к выполняемой команде, если узел настроен так делать.</dd>
|
||||
<dt class="optional">kill <span class="property-type">строка</span></dt>
|
||||
<dd>тип сигнала уничтожения для отправки существующему процессу узла exec.</dd>
|
||||
<dt class="optional">pid <span class="property-type">число|строка</span></dt>
|
||||
@@ -44,7 +44,7 @@
|
||||
</dl>
|
||||
<dl class="message-properties">
|
||||
<dt>rc <span class="property-type">объект</span></dt>
|
||||
<dd>только в exec режиме, копия объекта кода возврата (также доступна на порту 3)</dd>
|
||||
<dd>только в exec режиме, копия объекта кода возврата (также доступна по 3-му порту)</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li>Стандартный вывод ошибок
|
||||
@@ -54,7 +54,7 @@
|
||||
</dl>
|
||||
<dl class="message-properties">
|
||||
<dt>rc <span class="property-type">объект</span></dt>
|
||||
<dd>только в exec режиме, копия объекта кода возврата (также доступна на порту 3)</dd>
|
||||
<dd>только в exec режиме, копия объекта кода возврата (также доступна по 3-му порту)</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li>Код возврата
|
||||
@@ -73,7 +73,7 @@
|
||||
При желании вместо этого можно использовать <code>spawn</code>, который возвращает выходные данные из stdout и stderr по ходу выполнения команды, обычно по одной строке за раз. После завершения он возвращает объект на 3-й порт. Например, успешная команда должна вернуть <code>{code: 0}</code>.
|
||||
</p>
|
||||
<p>
|
||||
Ошибки могут возвращать дополнительную информацию на 3-м порту в <code>msg.payload</code>, такую как строка <code>message</code>, строка <code>signal</code>.
|
||||
Ошибки могут возвращать на 3-й порт дополнительную информацию в <code>msg.payload</code>, такую как строка <code>message</code>, строка <code>signal</code>.
|
||||
</p>
|
||||
<p>
|
||||
Выполняемая команда настраивается в узле, с возможностью добавления к ней <code>msg.payload</code> и дополнительного набора параметров.
|
||||
@@ -82,25 +82,25 @@
|
||||
Команды или параметры с пробелами должны быть заключены в кавычки - <code>"Это один параметр"</code>
|
||||
</p>
|
||||
<p>
|
||||
Возвращаемый <code>payload</code> обычно представляет собой <i>строку</i>, пока не обнаружены символы, отличные от UTF8, в этом случае это <i>буфер</i>.
|
||||
Возвращаемый <code>payload</code> обычно представляет собой <i>строку</i>, пока не обнаружены символы, отличные от UTF8, в этом случае возвращаемое значение будет иметь тип <i>буфер</i>.
|
||||
</p>
|
||||
<p>
|
||||
Значок состояния узла и PID будут видны, пока узел активен. Изменения в статусе могут быть прочитаны узлом <code>Status</code>.
|
||||
Значок статуса узла и PID будут видны, когда узел активен. Изменения в статусе можно отслеживать узлом <code>Status</code>.
|
||||
</p>
|
||||
|
||||
<h4>
|
||||
Уничтожения процессов
|
||||
</h4>
|
||||
<p>
|
||||
Отправка <code>msg.kill</code> уничтожит один активный процесс. <code>msg.kill</code> должен быть строкой, содержащей тип передаваемого сигнала, например, <code>SIGINT</code>, <code>SIGQUIT</code> или <code>SIGHUP</code>. По умолчанию <code>SIGTERM</code>, если задана пустая строка.
|
||||
Отправка <code>msg.kill</code> уничтожит один активный процесс. <code>msg.kill</code> должен быть строкой, содержащей тип передаваемого сигнала, например, <code>SIGINT</code>, <code>SIGQUIT</code> или <code>SIGHUP</code>. По умолчанию будет передан <code>SIGTERM</code>, если задана пустая строка.
|
||||
</p>
|
||||
<p>
|
||||
Если узлом запущено более одного процесса, тогда в <code>msg.pid</code> также должно быть установлено значение PID для уничтожения.
|
||||
Если узлом запущено более одного процесса, тогда в <code>msg.pid</code> также должно быть установлено значение PID процесса для уничтожения.
|
||||
</p>
|
||||
<p>
|
||||
Если в поле <code>Тайм-аут</code> указано значение, то, если процесс не завершится по истечении указанного количества секунд, он будет автоматически уничтожен
|
||||
Если в поле <code>Тайм-аут</code> введено значение, тогда, если процесс не завершится по истечении указанного количества секунд, он будет автоматически уничтожен.
|
||||
</p>
|
||||
<p>
|
||||
Совет: если Вы запускаете Python приложение, Вам может потребоваться использовать параметр <code>-u</code>, чтобы остановить буферизацию вывода.
|
||||
Совет: если вы запускаете Python приложение, вам может потребоваться использование параметра <code>-u</code>, чтобы остановить буферизацию вывода.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -46,7 +46,7 @@
|
||||
"bool": "логический тип",
|
||||
"json": "объект",
|
||||
"bin": "буфер",
|
||||
"date": "отметка времени",
|
||||
"date": "метка времени",
|
||||
"env": "переменная среды",
|
||||
"object": "объект",
|
||||
"string": "строка",
|
||||
@@ -55,7 +55,7 @@
|
||||
"Array": "массив",
|
||||
"invalid": "Неверный объект JSON"
|
||||
},
|
||||
"timestamp": "отметка времени",
|
||||
"timestamp": "метка времени",
|
||||
"none": "нет",
|
||||
"interval": "с интервалом",
|
||||
"interval-time": "с интервалом в промежутке",
|
||||
|
@@ -15,5 +15,5 @@
|
||||
-->
|
||||
|
||||
<script type="text/html" data-help-name="tls-config">
|
||||
<p>Параметры конфигурации для соединений TLS.</p>
|
||||
<p>Параметры конфигурации для TLS соединений.</p>
|
||||
</script>
|
||||
|
@@ -21,6 +21,6 @@
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
При доступе к хосту, находящемуся в списке игнорируемых хостов, прокси не будет использоваться.
|
||||
При обращении к хосту, находящемуся в списке игнорируемых хостов, прокси не будет использоваться.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -13,7 +13,7 @@
|
||||
|
||||
<script type="text/html" data-help-name="mqtt in">
|
||||
<p>
|
||||
Подключается к брокеру MQTT и подписывается на сообщения из указанной темы.
|
||||
Подключается к MQTT брокеру и подписывается на сообщения указанной темы.
|
||||
</p>
|
||||
|
||||
<h3>Выводит</h3>
|
||||
@@ -36,13 +36,13 @@
|
||||
Для этого узла требуется соединение с брокером MQTT. Это настраивается нажатием на значок карандаша.
|
||||
</p>
|
||||
<p>
|
||||
Несколько узлов MQTT (in или out) могут совместно использовать одно и то же соединение с брокером, если это необходимо.
|
||||
Несколько MQTT узлов (in или out) могут совместно использовать одно и то же соединение с брокером, если это необходимо.
|
||||
</p>
|
||||
</script>
|
||||
|
||||
<script type="text/html" data-help-name="mqtt out">
|
||||
<p>
|
||||
Подключается к брокеру MQTT и публикует сообщения.
|
||||
Подключается к MQTT брокеру и публикует сообщения.
|
||||
</p>
|
||||
|
||||
<h3>Принимает</h3>
|
||||
@@ -80,13 +80,13 @@
|
||||
|
||||
<script type="text/html" data-help-name="mqtt-broker">
|
||||
<p>
|
||||
Конфигурация для подключения к брокеру MQTT.
|
||||
Конфигурация для подключения к MQTT брокеру.
|
||||
</p>
|
||||
<p>
|
||||
Эта конфигурация создаст одно соединение с посредником, которое затем может быть повторно использовано узлами <code>MQTT In</code> и <code>MQTT Out</code>.
|
||||
</p>
|
||||
<p>
|
||||
Узел сгенерирует случайный идентификатор клиента, если он не задан, а узел настроен на использование соединения с чистым сеансом. Если идентификатор клиента установлен, он должен быть уникальным для брокера, к которому Вы подключаетесь.
|
||||
Узел сгенерирует случайный идентификатор клиента, если он не задан, а узел настроен на использование соединения с чистым сеансом. Если идентификатор клиента установлен, он должен быть уникальным для брокера, к которому вы подключаетесь.
|
||||
</p>
|
||||
|
||||
<h4>Birth сообщение</h4>
|
||||
@@ -96,7 +96,7 @@
|
||||
|
||||
<h4>Close сообщение</h4>
|
||||
<p>
|
||||
Это сообщение будет опубликовано в настроенной теме перед тем, как соединение будет закрыто нормально, либо путем повторного развертывания узла, либо остановкой.
|
||||
Это сообщение будет опубликовано в настроенной теме перед тем, как соединение будет закрыто обычным образом, либо путем повторного развертывания узла, либо остановкой.
|
||||
</p>
|
||||
|
||||
<h4>Will сообщение</h4>
|
||||
@@ -106,7 +106,7 @@
|
||||
|
||||
<h4>WebSockets</h4>
|
||||
<p>
|
||||
Узел может быть настроен на использование соединения WebSocket. Для этого в поле Сервер должен быть указан полный URI для соединения. Например:
|
||||
Узел может быть настроен на использование WebSocket соединения. Для этого в поле Сервер должен быть указан полный URI для соединения. Например:
|
||||
</p>
|
||||
<pre>ws://example.com:4000/mqtt</pre>
|
||||
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
<script type="text/html" data-help-name="http in">
|
||||
<p>
|
||||
Создает конечную точку HTTP для создания веб-сервисов.
|
||||
Создает конечную точку HTTP для веб-службы.
|
||||
</p>
|
||||
|
||||
<h3>Выводит</h3>
|
||||
@@ -35,12 +35,12 @@
|
||||
</ul>
|
||||
</dd>
|
||||
<dt>res<span class="property-type">объект</span></dt>
|
||||
<dd>Объект ответа HTTP. Это свойство не должно использоваться напрямую; узел ответа <code>HTTP Response</code> описывает, как ответить на запрос. Это свойство должно оставаться в сообщении, передаваемому узлу ответа.</dd>
|
||||
<dd>Объект ответа HTTP. Это свойство не должно использоваться напрямую. Для ответа на входящий HTTP запрос используется узел ответа <code>HTTP Response</code>. Это свойство должно оставаться в сообщении вплоть до передачи узлу ответа.</dd>
|
||||
</dl>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
По настроенному пути узел будет слушать запросы определенного типа. Путь может быть указан полностью, например <code>/user</code>, или включать именованные параметры, которые принимают любое значение, например <code>/user/:name</code>. Когда используются именованные параметры, их фактическое значение в запросе будет доступно в <code>msg.req.params</code>.
|
||||
По настроенному пути узел будет принимать запросы определенного типа. Путь может быть указан конкретно, например <code>/user</code>, или включать именованные параметры, которые принимают любое значение, например <code>/user/:name</code>. Когда используются именованные параметры, их фактическое значение в запросе будет доступно в <code>msg.req.params</code>.
|
||||
</p>
|
||||
<p>
|
||||
Для запросов, которые содержат тело, такие как POST или PUT, содержимое запроса доступно в <code>msg.payload</code>.
|
||||
@@ -67,7 +67,7 @@
|
||||
<dt class="optional">headers <span class="property-type">объект</span></dt>
|
||||
<dd>Если установлено, предоставляет заголовки HTTP для включения в ответ.</dd>
|
||||
<dt class="optional">cookies <span class="property-type">объект</span></dt>
|
||||
<dd>Если установлено, может использоваться для установки или удаления куков.</dd>
|
||||
<dd>Если установлено, может использоваться для записи или удаления куков.</dd>
|
||||
</dl>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
@@ -80,7 +80,7 @@
|
||||
Свойство <code>cookies</code> должно быть объектом пар имя/значение. Значением может быть либо строка для установки значения куки с параметрами по умолчанию, либо это может быть объект параметров.
|
||||
</p>
|
||||
<p>
|
||||
В следующем примере устанавливаются два куки - один с именем <code>name</code> со значением <code>nick</code>, другой с именем <code>session</code> со значением <code>1234</code> и сроком действия в 15 минут.
|
||||
В следующем примере устанавливаются два куки - один с именем <code>name</code> и значением <code>nick</code>, другой с именем <code>session</code> и значением <code>1234</code> и сроком действия в 15 минут.
|
||||
</p>
|
||||
<pre>
|
||||
msg.cookies = {
|
||||
|
@@ -32,7 +32,7 @@
|
||||
<dt class="optional">payload</dt>
|
||||
<dd>Отправляется как тело запроса.</dd>
|
||||
<dt class="optional">rejectUnauthorized</dt>
|
||||
<dd>Если установлено значение <code>false</code>, разрешает отправлять запросы на сайты https, которые используют самозаверяющие сертификаты.</dd>
|
||||
<dd>Если установлено значение <code>false</code>, разрешает отправлять запросы на сайты https, которые используют самозаверенные сертификаты.</dd>
|
||||
<dt class="optional">followRedirects</dt>
|
||||
<dd>Если установлено значение <code>false</code>, запрещает переадресацию (HTTP 301). По умолчанию <code>true</code>.</dd>
|
||||
<dt class="optional">requestTimeout</dt>
|
||||
@@ -68,20 +68,20 @@
|
||||
|
||||
<h4>Использование нескольких узлов HTTP-запросов</h4>
|
||||
<p>
|
||||
Чтобы использовать более одного из этих узлов в одном потоке, нужно позаботиться о свойстве <code>msg.headers</code>. Первый узел установит это свойство с заголовками ответа. Затем следующий узел будет использовать эти заголовки для своего запроса - обычно это неправильный подход. Если свойство <code>msg.headers</code> остается неизменным между узлами, оно будет проигнорировано вторым узлом. Чтобы установить пользовательские заголовки, сначала необходимо удалить <code>msg.headers</code> или сбросить до пустого объекта: <code>{}</code>.
|
||||
Чтобы использовать несколько таких узлов в одном потоке, нужно позаботиться о свойстве <code>msg.headers</code>. Первый узел установит это свойство с заголовками ответа. Затем следующий узел будет использовать эти заголовки для своего запроса - обычно это неправильный подход. Если свойство <code>msg.headers</code> остается неизменным между узлами, оно будет проигнорировано вторым узлом. Чтобы установить свои заголовки, сначала необходимо удалить <code>msg.headers</code> или сбросить это свойство до пустого объекта: <code>{}</code>.
|
||||
</p>
|
||||
|
||||
<h4>Обработка куки</h4>
|
||||
<p>
|
||||
Свойство <code>cookies</code>, передаваемое узлу, должно быть объектом пар имя/значение. Значением может быть либо строка для установки значения куки, либо это может быть объект с единственным свойством <code>value</code>.
|
||||
Свойство <code>cookies</code>, передаваемое узлу, должно быть объектом из пар имя/значение. Значением может быть либо строка для установки значения куки, либо это может быть объект с единственным свойством <code>value</code>.
|
||||
</p>
|
||||
<p>
|
||||
Все куки, возвращаемые запросом, передаются обратно в свойство <code>responseCookies</code>.
|
||||
Все куки, возвращаемые запросом, передаются обратно в свойстве <code>responseCookies</code>.
|
||||
</p>
|
||||
|
||||
<h4>Обработка типов контента</h4>
|
||||
<p>
|
||||
Если <code>msg.payload</code> является объектом, узел автоматически установит тип содержимого запроса в <code>application/json</code> и закодирует тело как таковое.
|
||||
Если <code>msg.payload</code> является объектом, узел автоматически установит тип содержимого запроса в <code>application/json</code> и закодирует тело соответствующим образом.
|
||||
</p>
|
||||
<p>
|
||||
Чтобы закодировать запрос как данные формы, для <code>msg.headers["content-type"]</code> должно быть установлено <code>application/x-www-form-urlencoded</code>.
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
<script type="text/html" data-help-name="websocket in">
|
||||
<p>
|
||||
Входной узел WebSocket.
|
||||
Входящий узел WebSocket.
|
||||
</p>
|
||||
<p>
|
||||
По умолчанию данные, полученные из WebSocket, будут в <code>msg.payload</code>. Сокет можно настроить так, чтобы он ожидал правильно сформированную строку JSON. В этом случае он будет анализировать JSON и отправлять полученный объект как полное сообщение.
|
||||
@@ -25,17 +25,17 @@
|
||||
|
||||
<script type="text/html" data-help-name="websocket out">
|
||||
<p>
|
||||
Выходной узел WebSocket.
|
||||
Исходящий узел WebSocket.
|
||||
</p>
|
||||
<p>
|
||||
По умолчанию <code>msg.payload</code> будет отправлено через WebSocket. Сокет может быть сконфигурирован для кодирования всего объекта <code>msg</code> в виде строки JSON и отправки его через WebSocket.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Если сообщение, поступающее на этот узел, началось с узла WebSocket In, сообщение будет отправлено обратно клиенту, который запустил поток. В противном случае сообщение будет передано всем подключенным клиентам.
|
||||
Если сообщение, поступающее на этот узел, было начато в потоке узлом WebSocket In, сообщение будет отправлено обратно клиенту, который запустил поток. В противном случае сообщение будет передано всем подключенным клиентам.
|
||||
</p>
|
||||
<p>
|
||||
Если Вы хотите передать сообщение, которое началось на узле WebSocket In, всем подключенным клиентам, тогда Вы должны удалить свойство <code>msg._session</code> в потоке.
|
||||
Если Вы хотите передать сообщение, которое началось с узла WebSocket In, всем подключенным клиентам, тогда вам нужно удалить свойство <code>msg._session</code> перед тем как передавать его этому узлу.
|
||||
</p>
|
||||
</script>
|
||||
|
||||
|
@@ -16,16 +16,16 @@
|
||||
|
||||
<script type="text/html" data-help-name="tcp in">
|
||||
<p>
|
||||
Предоставляет выбор TCP-входов. Можно либо подключаться к удаленному TCP-порту, либо принимать входящие подключения.
|
||||
Предоставляет выбор из нескольких входящих TCP-узлов. Можно либо подключаться к удаленному TCP-порту, либо принимать входящие подключения.
|
||||
</p>
|
||||
<p>
|
||||
<b>Примечание.</b> В некоторых системах Вам могут потребоваться права root или администратора для доступа к портам ниже 1024.
|
||||
<b>Примечание.</b> В некоторых системах вам могут потребоваться права root или администратора для доступа к портам ниже 1024.
|
||||
</p>
|
||||
</script>
|
||||
|
||||
<script type="text/html" data-help-name="tcp out">
|
||||
<p>
|
||||
Предоставляет выбор TCP-выходов. Может подключаться к удаленному TCP-порту, принимать входящие подключения или отвечать на сообщения, полученные от узла TCP In.
|
||||
Предоставляет выбор из нескольких исходящих TCP-узлов. Может подключаться к удаленному TCP-порту, принимать входящие подключения или отвечать на сообщения, полученные от узла TCP In.
|
||||
</p>
|
||||
<p>
|
||||
Отправляются только данные <code>msg.payload</code>.
|
||||
@@ -37,21 +37,21 @@
|
||||
Если <code>msg._session</code> отсутствует, данные отправляется <b>всем</b> подключенным клиентам.
|
||||
</p>
|
||||
<p>
|
||||
<b>Примечание.</b> В некоторых системах Вам могут потребоваться права root или администратора для доступа к портам ниже 1024.
|
||||
<b>Примечание.</b> В некоторых системах вам могут потребоваться права root или администратора для доступа к портам ниже 1024.
|
||||
</p>
|
||||
</script>
|
||||
|
||||
<script type="text/html" data-help-name="tcp request">
|
||||
<p>
|
||||
Простой узел TCP-запроса - отправляет <code>msg.payload</code> на tcp-порт сервера и ожидает ответа.
|
||||
Узел TCP-запроса - отправляет <code>msg.payload</code> на tcp-порт сервера и ожидает ответа.
|
||||
</p>
|
||||
<p>
|
||||
Подключается, отправляет "запрос" и читает "ответ". Он может либо подсчитать количество возвращенных символов в фиксированный буфер, сопоставить указанный символ перед возвратом, дождаться фиксированного времени ожидания от первого ответа и затем вернуться, сидеть и дожидаться данных, или отправить, а затем немедленно закрыть соединение, не дожидаясь ответа.
|
||||
</p>
|
||||
<p>
|
||||
Ответ будет выведен в <code>msg.payload</code> в виде буфера, поэтому Вы можете захотеть применить к нему .toString().
|
||||
Ответ будет возвращен в <code>msg.payload</code> в виде буфера, поэтому вам может понадобиться применить к нему .toString(), если нужно преобразование в строку.
|
||||
</p>
|
||||
<p>
|
||||
Если Вы оставите tcp-хост или порт пустыми, они должны быть установлены с помощью свойств <code>msg.host</code> и <code>msg.port</code> в каждом сообщении, отправляемом узлу.
|
||||
Если вы оставите tcp-хост или порт пустыми, они должны быть установлены с помощью свойств <code>msg.host</code> и <code>msg.port</code> в каждом сообщении, отправляемом узлу.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -16,13 +16,13 @@
|
||||
|
||||
<script type="text/html" data-help-name="udp in">
|
||||
<p>
|
||||
Входной узел UDP, который создает <code>msg.payload</code>, содержащий буфер, строку или base64-строку. Поддерживает многоадресную рассылку.
|
||||
Входящий UDP-узел, который создает <code>msg.payload</code>, содержащий буфер, строку или base64-строку. Поддерживает многоадресную рассылку.
|
||||
</p>
|
||||
<p>
|
||||
Он также предоставляет <code>msg.ip</code> и <code>msg.port</code> для IP-адреса и порта, с которого было получено сообщение.
|
||||
</p>
|
||||
<p>
|
||||
<b>Примечание</b>. В некоторых системах Вам могут потребоваться права root или администратора для доступа к портам ниже 1024 и/или широковещательной рассылки.
|
||||
<b>Примечание</b>. В некоторых системах вам могут потребоваться права root или администратора для доступа к портам ниже 1024 и/или широковещательной рассылки.
|
||||
</p>
|
||||
</script>
|
||||
|
||||
@@ -37,6 +37,6 @@
|
||||
Если Вы выберете широковещательную рассылку, то либо задайте в качестве адреса локальный широковещательный IP-адрес, либо попробуйте 255.255.255.255, который является глобальным широковещательным адресом.
|
||||
</p>
|
||||
<p>
|
||||
<b>Примечание</b>. В некоторых системах Вам могут потребоваться права root или администратора для доступа к портам ниже 1024 и/или широковещательной рассылки.
|
||||
<b>Примечание</b>. В некоторых системах вам могут потребоваться права root или администратора для доступа к портам ниже 1024 и/или широковещательной рассылки.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -30,10 +30,10 @@
|
||||
<dt>payload<span class="property-type">объект | массив | строка</span></dt>
|
||||
<dd>
|
||||
<ul>
|
||||
<li>Если вход является значением строкового типа, узел пытается проанализировать ее как CSV и создает объект JavaScript из пар ключ/значение для каждой строки. Затем узел либо отправит сообщение для каждой строки или одно сообщение, содержащее массив объектов.</li>
|
||||
<li>Если вход является JavaScript объектом, узел пытается построить CSV-строку.</li>
|
||||
<li>Если вход является массивом простых значений, узел построит однострочную CSV-строку.</li>
|
||||
<li>Если вход является массивом массивов или массивом объектов, создается многострочная CSV-строка.</li>
|
||||
<li>Если на входе значение строкового типа, узел попытается проанализировать его как CSV и создает объект JavaScript из пар ключ/значение для каждой строки. Затем узел либо отправит сообщение для каждой строки или одно сообщение, содержащее массив объектов.</li>
|
||||
<li>Если на входе JavaScript объект, узел попробует построить CSV-строку.</li>
|
||||
<li>Если на входе массив простых значений, узел построит однострочную CSV-строку.</li>
|
||||
<li>Если на входе массив массивов или массив объектов, создается многострочная CSV-строка.</li>
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
@@ -46,7 +46,7 @@
|
||||
При преобразовании в CSV шаблон столбцов используется для определения того, какие свойства извлекать из объекта и в каком порядке.
|
||||
</p>
|
||||
<p>
|
||||
Если шаблон пуст, то узел может использовать простой список свойств, разделенных запятыми, предоставленных в <code>msg.columns</code>, чтобы определить, что извлечь. Если этого нет, то все свойства объекта выводятся в том порядке, в котором они были найдены в первой строке.
|
||||
Если шаблон пуст, то узел может использовать простой список свойств, разделенных запятыми, предоставленных в <code>msg.columns</code>, чтобы определить, что извлечь. Если его нет, то все свойства объекта выводятся в том порядке, в котором они были найдены в первой строке.
|
||||
</p>
|
||||
<p>
|
||||
Если входные данные являются массивом, то шаблон столбцов используется только для необязательного генерирования строки с заголовками столбцов.
|
||||
|
@@ -37,7 +37,7 @@
|
||||
</ul>
|
||||
</dd>
|
||||
<dt>schemaError<span class="property-type">массив</span></dt>
|
||||
<dd>Если проверка JSON-схемы завершится неудачно, узел catch будет иметь свойство <code>schemaError</code>, содержащее массив ошибок.</dd>
|
||||
<dd>Если проверка JSON-схемы завершится неудачно, узлом catch можно получить свойство <code>schemaError</code>, содержащее массив ошибок.</dd>
|
||||
</dl>
|
||||
|
||||
<h3>Подробности</h3>
|
||||
@@ -45,10 +45,10 @@
|
||||
По умолчанию узел работает с <code>msg.payload</code>, но его можно настроить для преобразования любого свойства сообщения.
|
||||
</p>
|
||||
<p>
|
||||
Узел также может быть сконфигурирован для обеспечения конкретной кодировки вместо переключения между ними. Это можно использовать, например, с узлом <code>HTTP In</code>, чтобы гарантировать, что данные payload являются объектом, даже если входящий запрос неправильно установил свой тип содержимого для узла HTTP In, чтобы выполнить преобразование.
|
||||
Узел также может быть сконфигурирован для обеспечения конкретной кодировки вместо переключения между ними. Это можно использовать, например, при работе с узлом <code>HTTP In</code>, чтобы гарантировать, что данные payload всегда будут являться объектом, даже если входящий запрос неправильно установил свой тип содержимого для узла HTTP In, чтобы выполнить преобразование.
|
||||
</p>
|
||||
<p>
|
||||
Если узел настроен на то, чтобы свойство кодировалось как строка, и он получает строку, дальнейшие проверки этого свойства выполняться не будут. Он не будет проверять, является ли строка допустимым JSON, и не будет переформатировать ее, если выбрана опция форматирования.
|
||||
Если узел настроен так, чтобы свойство кодировалось как строка, и он получает строку, дальнейшие проверки этого свойства выполняться не будут. Он не будет проверять, является ли строка допустимым JSON, и не будет переформатировать ее, если выбрана опция форматирования.
|
||||
</p>
|
||||
<p>
|
||||
Подробнее о JSON-схеме Вы можете узнать в спецификации <a href="http://json-schema.org/latest/json-schema-validation.html">здесь</a>.
|
||||
|
@@ -32,8 +32,8 @@
|
||||
<dt>payload<span class="property-type">объект | строка</span></dt>
|
||||
<dd>
|
||||
<ul>
|
||||
<li>Если вход является значением строкового типа, узел пытается проанализировать ее как XML и создает объект JavaScript.</li>
|
||||
<li>Если вход является JavaScript объектом, узел пытается построить XML-строку.</li>
|
||||
<li>Если на входе значение строкового типа, узел пытается проанализировать его как XML и создает объект JavaScript.</li>
|
||||
<li>Если на входе JavaScript объект, узел пытается построить XML-строку.</li>
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
|
@@ -30,8 +30,8 @@
|
||||
<dt>payload<span class="property-type">объект | строка</span></dt>
|
||||
<dd>
|
||||
<ul>
|
||||
<li>Если вход является YAML-строкой, узел пытается проанализировать ее как JavaScript объект.</li>
|
||||
<li>Если вход является JavaScript объектом, узел создает YAML-строку.</li>
|
||||
<li>Если на входе YAML-строка, узел пытается проанализировать ее как JavaScript объект.</li>
|
||||
<li>Если на входе JavaScript объект, узел создает YAML-строку.</li>
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
|
@@ -24,7 +24,7 @@
|
||||
<dt>payload<span class="property-type">объект | строка | массив | буфер</span></dt>
|
||||
<dd>Поведение узла определяется типом <code>msg.payload</code>:
|
||||
<ul>
|
||||
<li><b>строка</b>/<b>буфер</b> - сообщение разделяется с помощью указанного символа (по умолчанию: <code>\n</code>), последовательности буфера или фиксированной длины.</li>
|
||||
<li><b>строка</b>/<b>буфер</b> - сообщение разделяется с помощью указанного символа (по умолчанию: <code>\n</code>), последовательности буфера или по фиксированной длине.</li>
|
||||
<li><b>массив</b> - сообщение разбивается на отдельные элементы массива или массивы фиксированной длины.</li>
|
||||
<li><b>объект</b> - сообщение отправляется для каждой пары ключ/значение объекта.</li>
|
||||
</ul>
|
||||
@@ -34,7 +34,7 @@
|
||||
<h3>Выводит</h3>
|
||||
<dl class="message-properties">
|
||||
<dt>parts<span class="property-type">объект</span></dt>
|
||||
<dd>Это свойство содержит информацию о том, как сообщение было отделено от исходного сообщения. При передаче на узел <b>join</b> последовательность может быть собрана в одно сообщение. Свойство имеет следующие свойства:
|
||||
<dd>Это свойство содержит информацию о том, как сообщение было отделено от исходного сообщения. При передаче на узел <b>join</b> последовательность может быть собрана обратно в одно сообщение. Объект содержит следующие свойства:
|
||||
<ul>
|
||||
<li><code>id</code> - идентификатор группы сообщений</li>
|
||||
<li><code>index</code> - позиция в группе</li>
|
||||
@@ -49,7 +49,7 @@
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
Этот узел облегчает создание потока, который выполняет общие действия над последовательностью сообщений, перед тем как с помощью узла <b>join</b> объединить последовательность в одно сообщение.
|
||||
Этот узел облегчает создание потока, который выполняет общие действия над последовательностью сообщений, перед тем как с помощью узла <b>join</b> объединить последовательность обратно в одно сообщение.
|
||||
</p>
|
||||
<p>
|
||||
Он использует свойство <code>msg.parts</code> для отслеживания отдельных частей последовательности.
|
||||
@@ -60,7 +60,7 @@
|
||||
Узел также может использоваться для переформатирования потока сообщений. Например, последовательное устройство, которое отправляет завершенные новой строкой команды, может доставлять одно сообщение с частичной командой в конце. В 'потоковом режиме' этот узел будет разбивать сообщение и отправлять каждый завершенный сегмент. Если в конце есть частичный сегмент, узел удержит его и добавит к следующему полученному сообщению.
|
||||
</p>
|
||||
<p>
|
||||
При работе в этом режиме узел не будет устанавливать свойство <code>msg.parts.count</code>, так как он не знает, сколько сообщений ожидать в потоке. Это означает, что его нельзя использовать с узлом <b>join</b> в его автоматическом режиме.
|
||||
При работе в этом режиме узел не будет устанавливать свойство <code>msg.parts.count</code>, так как он не знает, сколько сообщений ожидать в потоке. Это означает, что его нельзя использовать вместе с узлом <b>join</b> в его автоматическом режиме.
|
||||
</p>
|
||||
</script>
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
</p>
|
||||
<dl>
|
||||
<dt>автоматический</dt>
|
||||
<dd>При использовании с узлом <b>split</b> он автоматически объединит сообщения, чтобы отменить выполненное разделение.</dd>
|
||||
<dd>При использовании с узлом <b>split</b> он автоматически объединит сообщения, чтобы восстановить структуру сообщения, которая была до разделения.</dd>
|
||||
<dt>ручной</dt>
|
||||
<dd>Объединяет последовательности сообщений различными способами.</dd>
|
||||
<dt>агрегация последовательности</dt>
|
||||
@@ -103,7 +103,7 @@
|
||||
<h3>Подробности</h3>
|
||||
<h4>Автоматический режим</h4>
|
||||
<p>
|
||||
В автоматическом режиме используется свойство <code>parts</code> входящих сообщений, чтобы определить способ объединения последовательности. Это позволяет автоматически отменять действие узла <b>split</b>.
|
||||
В автоматическом режиме используется свойство <code>parts</code> входящих сообщений, чтобы определить способ объединения последовательности. Это позволяет автоматически выполнять обратное действие для узла <b>split</b>.
|
||||
</p>
|
||||
|
||||
<h4>Ручной режим</h4>
|
||||
@@ -123,7 +123,7 @@
|
||||
Свойство <i>кол-во</i> может быть установлено для количества сообщений, которое должно быть получено перед генерацией выходного сообщения. Для выходных данных объекта, когда это число достигнуто, узел может быть настроен на отправку сообщения для каждого последующего полученного сообщения.
|
||||
</p>
|
||||
<p>
|
||||
Свойство <i>время (сек)</i> может быть установлено, чтобы инициировать отправку нового сообщения с использованием того, что было получено до сих пор.
|
||||
Свойство <i>время (сек)</i> может быть установлено, чтобы инициировать отправку нового сообщения с использованием всего, что было получено до сих пор.
|
||||
</p>
|
||||
<p>
|
||||
Если сообщение получено с установленным свойством <b>msg.complete</b>, выходное сообщение завершается и отправляется. Это сбрасывает любой подсчет частей.
|
||||
|
@@ -48,7 +48,7 @@
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
<b>Примечание.</b> Этот узел внутренне хранит сообщения для своей работы. Чтобы предотвратить непредвиденное использование памяти, можно указать максимальное количество хранимых сообщений. По умолчанию количество сообщений не ограничено.
|
||||
<b>Примечание.</b> Этот узел буферизирует сообщения внутри для своей работы. Чтобы предотвратить непредвиденное использование памяти, можно указать максимальное количество хранимых сообщений. По умолчанию количество сообщений не ограничено.
|
||||
<ul>
|
||||
<li>Свойство <code>nodeMessageBufferMaxLength</code> устанавливается в <b>settings.js</b>.</li>
|
||||
</ul>
|
||||
|
@@ -37,7 +37,7 @@
|
||||
|
||||
<h4>Хранение сообщений</h4>
|
||||
<p>
|
||||
Этот узел будет буферизировать сообщения внутри, чтобы работать между последовательностями. Параметр <code>nodeMessageBufferMaxLength</code> можно использовать для ограничения количества сообщений, которые узел будут буферизовать.
|
||||
Этот узел будет буферизировать сообщения внутри, чтобы работать с последовательностями. Параметр <code>nodeMessageBufferMaxLength</code> можно использовать для ограничения количества сообщений, которые узел будут буферизовать.
|
||||
</p>
|
||||
<p>
|
||||
Если сообщение получено с установленным свойством <b>msg.reset</b>, буферизованные сообщения удаляются и не отправляются.
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
<script type="text/html" data-help-name="file">
|
||||
<p>
|
||||
Записывает <code>msg.payload</code> в файл, либо добавляя в конец, либо заменяя существующий контент. Кроме того, он может удалить файл.
|
||||
Записывает <code>msg.payload</code> в файл, либо добавлением в конец, либо заменой существующего контента. Кроме того, им можно удалять файл.
|
||||
</p>
|
||||
|
||||
<h3>Принимает</h3>
|
||||
@@ -38,7 +38,7 @@
|
||||
Если используется <code>msg.filename</code>, файл будет закрыт после каждой записи. Для лучшей производительности используйте фиксированное имя файла.
|
||||
</p>
|
||||
<p>
|
||||
Он может быть настроен на перезапись всего файла, а не на добавление. Например, при записи двоичных данных в файл, например изображение, следует использовать эту опцию и отключить опцию добавления новой строки.
|
||||
Он может быть настроен на перезапись всего файла, а не на добавление. Например, при записи двоичных данных (типа изображения) в файл, следует использовать эту опцию и отключить опцию добавления новой строки.
|
||||
</p>
|
||||
<p>
|
||||
Кодировка данных, записанных в файл, может быть выбрана в списке кодировок.
|
||||
@@ -50,13 +50,13 @@
|
||||
|
||||
<script type="text/html" data-help-name="file in">
|
||||
<p>
|
||||
Читает содержимое файла как строковый тип или двоичный буфер.
|
||||
Читает содержимое файла как строку или двоичный буфер.
|
||||
</p>
|
||||
|
||||
<h3>Принимает</h3>
|
||||
<dl class="message-properties">
|
||||
<dt class="optional">filename <span class="property-type">строка</span></dt>
|
||||
<dd>если не задано в конфигурации узла, это свойство устанавливает имя файла для чтения.</dd>
|
||||
<dd>это свойство устанавливает имя файла для чтения, если оно не задано в настройках узла.</dd>
|
||||
</dl>
|
||||
|
||||
<h3>Выводит</h3>
|
||||
@@ -69,13 +69,13 @@
|
||||
|
||||
<h3>Подробности</h3>
|
||||
<p>
|
||||
Имя файла должно быть абсолютным путем, иначе оно будет относительно рабочего каталога процесса Node-RED.
|
||||
Имя файла должно быть абсолютным путем к файлу, иначе оно будет путем относительно рабочего каталога процесса Node-RED.
|
||||
</p>
|
||||
<p>
|
||||
В Windows может быть необходимо кодировать разделители пути двойной косой чертой, например: <code>\\Users\\myUser</code>.
|
||||
</p>
|
||||
<p>
|
||||
При желании текстовый файл можно разбить на строки, выводя по одному сообщению на строку, или двоичный файл разбить на более мелкие фрагменты буфера - размер блока зависит от операционной системы, но обычно составляет 64 КБ (Linux/Mac) или 41 КБ (Windows).
|
||||
При желании текстовый файл можно разбить на строки, выводя по одному сообщению для каждой строки, или двоичный файл разбить на более мелкие фрагменты буфера - размер блока зависит от операционной системы, но обычно составляет 64 КБ (Linux/Mac) или 41 КБ (Windows).
|
||||
</p>
|
||||
<p>
|
||||
При разбиении на несколько сообщений каждое сообщение будет иметь свойство <code>parts</code>, формирующее полную последовательность сообщений.
|
||||
|
@@ -16,13 +16,13 @@
|
||||
|
||||
<script type="text/html" data-help-name="watch">
|
||||
<p>
|
||||
Наблюдает за изменениями каталога или файла.
|
||||
Наблюдает за изменениями директории или файла.
|
||||
</p>
|
||||
<p>
|
||||
Вы можете ввести список разделенных запятыми каталогов и/или файлов. Вам нужно взять в кавычки "..." те из них, в которых есть пробелы.
|
||||
Вы можете ввести список разделенных запятыми директорий и/или файлов. Вам нужно взять в кавычки "..." те из них, в которых есть пробелы.
|
||||
</p>
|
||||
<p>
|
||||
В Windows Вы должны использовать двойную обратную косую черту \\ в любых именах каталогов.
|
||||
В Windows вы должны использовать двойную обратную косую черту \\ вместо одной в именах директорий.
|
||||
</p>
|
||||
<p>
|
||||
Полное имя фактически измененного файла помещается в <code>msg.payload</code> и <code>msg.filename</code>, а строковая версия списка наблюдения возвращается в <code>msg.topic</code>.
|
||||
@@ -31,9 +31,9 @@
|
||||
<code>msg.file</code> содержит только краткое имя файла, который изменился. <code>msg.type</code> содержит тип измененной единицы, обычно это <i>file</i> для файла или <i>directory</i> для директории, тогда как <code>msg.size</code> содержит размер файла в байтах.
|
||||
</p>
|
||||
<p>
|
||||
В Linux <i>все</i> является файлом, и может быть под наблюдением...
|
||||
В Linux <i>все</i> является файлами, и может быть под наблюдением...
|
||||
</p>
|
||||
<p>
|
||||
<b>Примечание.</b> Наблюдаемые каталог или файл должны существовать. Если файл или каталог будет удален, они могут перестать отслеживаться, даже если они будут созданы заново.
|
||||
<b>Примечание.</b> Наблюдаемые директория или файл должны существовать. Если файл или директория будут удалены, они могут перестать отслеживаться, даже если они затем будут созданы заново.
|
||||
</p>
|
||||
</script>
|
||||
|
@@ -23,7 +23,7 @@
|
||||
"cookie": "0.4.1",
|
||||
"cors": "2.8.5",
|
||||
"cron": "1.7.2",
|
||||
"denque": "1.4.1",
|
||||
"denque": "1.5.0",
|
||||
"fs-extra": "8.1.0",
|
||||
"fs.notify": "0.0.4",
|
||||
"hash-sum": "2.0.0",
|
||||
@@ -31,9 +31,9 @@
|
||||
"is-utf8": "0.2.1",
|
||||
"js-yaml": "3.14.0",
|
||||
"media-typer": "1.1.0",
|
||||
"mqtt": "4.2.5",
|
||||
"mqtt": "4.2.6",
|
||||
"multer": "1.4.2",
|
||||
"mustache": "4.0.1",
|
||||
"mustache": "4.1.0",
|
||||
"on-headers": "1.0.2",
|
||||
"raw-body": "2.4.1",
|
||||
"request": "2.88.0",
|
||||
|
Reference in New Issue
Block a user