Merge branch 'node-red:master' into master

This commit is contained in:
unborn-andy 2022-01-05 17:26:16 +02:00 committed by GitHub
commit c33e600478
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 122 additions and 139 deletions

View File

@ -41,14 +41,14 @@
"grunt-simple-mocha": "^0.4.1", "grunt-simple-mocha": "^0.4.1",
"imap": "^0.8.19", "imap": "^0.8.19",
"mailparser": "^3.4.0", "mailparser": "^3.4.0",
"markdown-it": "^12.2.0", "markdown-it": "^12.3.0",
"mocha": "~6.2.3", "mocha": "~6.2.3",
"msgpack-lite": "^0.1.26", "msgpack-lite": "^0.1.26",
"multilang-sentiment": "^1.2.0", "multilang-sentiment": "^1.2.0",
"ngeohash": "^0.6.3", "ngeohash": "^0.6.3",
"node-red": "^2.1.3", "node-red": "^2.1.4",
"node-red-node-test-helper": "^0.2.7", "node-red-node-test-helper": "^0.2.7",
"nodemailer": "^6.7.1", "nodemailer": "^6.7.2",
"poplib": "^0.1.7", "poplib": "^0.1.7",
"proxyquire": "^2.1.3", "proxyquire": "^2.1.3",
"pushbullet": "^2.4.0", "pushbullet": "^2.4.0",

View File

@ -33,7 +33,7 @@ var net = require("net"),
// Constructor // Constructor
function POP3Client(port, host, options) { function POP3Client(port, host, options) {
if (options === undefined) options = {}; if (options === undefined) { options = {}; }
// Optional constructor arguments // Optional constructor arguments
var enabletls = options.enabletls !== undefined ? options.enabletls: false; var enabletls = options.enabletls !== undefined ? options.enabletls: false;
@ -113,10 +113,10 @@ function POP3Client(port, host, options) {
var text = command; var text = command;
if (argument !== undefined) text = text + " " + argument + "\r\n"; if (argument !== undefined) { text = text + " " + argument + "\r\n"; }
else text = text + "\r\n"; else { text = text + "\r\n"; }
if (debug) console.log("Client: " + util.inspect(text)); if (debug) { console.log("Client: " + util.inspect(text)); }
socket.write(text); socket.write(text);
@ -178,7 +178,7 @@ function POP3Client(port, host, options) {
cleartext.authorized = false; cleartext.authorized = false;
function onerror(e) { function onerror(e) {
if (cleartext._controlReleased) cleartext.emit('error', e); if (cleartext._controlReleased) { cleartext.emit('error', e); }
} }
function onclose() { function onclose() {
@ -200,7 +200,7 @@ function POP3Client(port, host, options) {
data = data.toString("ascii"); data = data.toString("ascii");
bufferedData += data; bufferedData += data;
if (debug) console.log("Server: " + util.inspect(data)); if (debug) { console.log("Server: " + util.inspect(data)); }
if (checkResp === true) { if (checkResp === true) {
@ -256,10 +256,8 @@ function POP3Client(port, host, options) {
} }
function onError(err) { function onError(err) {
if (err.errno === 111) { self.emit("connect", false, err); }
if (err.errno === 111) self.emit("connect", false, err); else { self.emit("error", err); }
else self.emit("error", err);
} }
function onEnd(data) { function onEnd(data) {
@ -284,16 +282,16 @@ function POP3Client(port, host, options) {
rejectUnauthorized: !self.data.ignoretlserrs rejectUnauthorized: !self.data.ignoretlserrs
}, function() { }, function() {
if (tlssock.authorized === false && if (tlssock.authorized === false && self.data["ignoretlserrs"] === false) {
self.data["ignoretlserrs"] === false)
self.emit("tls-error", tlssock.authorizationError); self.emit("tls-error", tlssock.authorizationError);
}
} }
); );
socket = tlssock; socket = tlssock;
} else socket = new net.createConnection(port, host); } else { socket = new net.createConnection(port, host); }
// Set up event handlers // Set up event handlers
socket.on("data", onData); socket.on("data", onData);
@ -309,8 +307,8 @@ POP3Client.prototype.login = function (username, password) {
var self = this; var self = this;
if (self.getState() !== 1) self.emit("invalid-state", "login"); if (self.getState() !== 1) { self.emit("invalid-state", "login"); }
else if (self.getLocked() === true) self.emit("locked", "login"); else if (self.getLocked() === true) { self.emit("locked", "login"); }
else { else {
self.setLocked(true); self.setLocked(true);
@ -329,7 +327,7 @@ POP3Client.prototype.login = function (username, password) {
self.setLocked(false); self.setLocked(false);
self.setCallback(function() {}); self.setCallback(function() {});
if (resp !== false) self.setState(2); if (resp !== false) { self.setState(2); }
self.emit("login", resp, data); self.emit("login", resp, data);
}); });
@ -355,8 +353,8 @@ POP3Client.prototype.auth = function (type, username, password) {
var types = {"PLAIN": 1, "CRAM-MD5": 1}; var types = {"PLAIN": 1, "CRAM-MD5": 1};
var initialresp = ""; var initialresp = "";
if (self.getState() !== 1) self.emit("invalid-state", "auth"); if (self.getState() !== 1) { self.emit("invalid-state", "auth"); }
else if (self.getLocked() === true) self.emit("locked", "auth"); else if (self.getLocked() === true) { self.emit("locked", "auth"); }
if ((type in types) === false) { if ((type in types) === false) {
@ -372,7 +370,7 @@ POP3Client.prototype.auth = function (type, username, password) {
initialresp = " " + new Buffer(username + "\u0000" + username + "\u0000" + password).toString("base64") + "="; initialresp = " " + new Buffer(username + "\u0000" + username + "\u0000" + password).toString("base64") + "=";
self.setCallback(function(resp, data) { self.setCallback(function(resp, data) {
if (resp !== false) self.setState(2); if (resp !== false) { self.setState(2); }
self.emit("auth", resp, data, data); self.emit("auth", resp, data, data);
}); });
@ -381,7 +379,7 @@ POP3Client.prototype.auth = function (type, username, password) {
self.setCallback(function(resp, data) { self.setCallback(function(resp, data) {
if (resp === false) self.emit("auth", resp, "Server responded -ERR to AUTH CRAM-MD5", data); if (resp === false) { self.emit("auth", resp, "Server responded -ERR to AUTH CRAM-MD5", data); }
else { else {
var challenge = new Buffer(data.trim().substr(2), "base64").toString(); var challenge = new Buffer(data.trim().substr(2), "base64").toString();
@ -392,8 +390,8 @@ POP3Client.prototype.auth = function (type, username, password) {
var errmsg = null; var errmsg = null;
if (resp !== false) self.setState(2); if (resp !== false) { self.setState(2); }
else errmsg = "Server responded -ERR to response"; else {errmsg = "Server responded -ERR to response"; }
self.emit("auth", resp, null, data); self.emit("auth", resp, null, data);
@ -420,25 +418,25 @@ POP3Client.prototype.auth = function (type, username, password) {
// We (optionally) ignore self signed cert errors, // We (optionally) ignore self signed cert errors,
// in blatant violation of RFC 2595, Section 2.4 // in blatant violation of RFC 2595, Section 2.4
if (self.data["ignoretlserrs"] === true && rawdata === "DEPTH_ZERO_SELF_SIGNED_CERT") tlsok(); if (self.data["ignoretlserrs"] === true && rawdata === "DEPTH_ZERO_SELF_SIGNED_CERT"){ tlsok(); }
else self.emit("auth", false, "Unable to upgrade connection to STLS", rawdata); else { self.emit("auth", false, "Unable to upgrade connection to STLS", rawdata); }
} else tlsok(); } else { tlsok(); }
}); });
self.stls(); self.stls();
} else tlsok(); } else { tlsok(); }
}; };
POP3Client.prototype.apop = function (username, password) { POP3Client.prototype.apop = function (username, password) {
var self = this; var self = this;
if (self.getState() !== 1) self.emit("invalid-state", "apop"); if (self.getState() !== 1) { self.emit("invalid-state", "apop"); }
else if (self.getLocked() === true) self.emit("locked", "apop"); else if (self.getLocked() === true) { self.emit("locked", "apop"); }
else if (self.data["apop"] === false) self.emit("apop", false, "APOP support not detected on remote server"); else if (self.data["apop"] === false) { self.emit("apop", false, "APOP support not detected on remote server"); }
else { else {
self.setLocked(true); self.setLocked(true);
@ -447,7 +445,7 @@ POP3Client.prototype.apop = function (username, password) {
self.setLocked(false); self.setLocked(false);
self.setCallback(function() {}); self.setCallback(function() {});
if (resp === true) self.setState(2); if (resp === true) { self.setState(2); }
self.emit("apop", resp, data); self.emit("apop", resp, data);
}); });
@ -462,9 +460,9 @@ POP3Client.prototype.stls = function() {
var self = this; var self = this;
if (self.getState() !== 1) self.emit("invalid-state", "stls"); if (self.getState() !== 1) { self.emit("invalid-state", "stls"); }
else if (self.getLocked() === true) self.emit("locked", "stls"); else if (self.getLocked() === true) { self.emit("locked", "stls"); }
else if (self.data["tls"] === true) self.emit("stls", false, "Unable to execute STLS as TLS connection already established"); else if (self.data["tls"] === true) { self.emit("stls", false, "Unable to execute STLS as TLS connection already established"); }
else { else {
self.setLocked(true); self.setLocked(true);
@ -477,9 +475,7 @@ POP3Client.prototype.stls = function() {
self.setCallback(function(resp, data) { self.setCallback(function(resp, data) {
if (resp === false && self.data["ignoretlserrs"] === true && data === "DEPTH_ZERO_SELF_SIGNED_CERT") if (resp === false && self.data["ignoretlserrs"] === true && data === "DEPTH_ZERO_SELF_SIGNED_CERT") {resp = true; }
resp = true;
self.data["stls"] = true; self.data["stls"] = true;
self.emit("stls", resp, data); self.emit("stls", resp, data);
@ -487,7 +483,7 @@ POP3Client.prototype.stls = function() {
self.starttls(); self.starttls();
} else self.emit("stls", false, data); } else { self.emit("stls", false, data); }
}); });
self.setMultiline(false); self.setMultiline(false);
@ -501,8 +497,8 @@ POP3Client.prototype.top = function(msgnumber, lines) {
var self = this; var self = this;
if (self.getState() !== 2) self.emit("invalid-state", "top"); if (self.getState() !== 2) { self.emit("invalid-state", "top"); }
else if (self.getLocked() === true) self.emit("locked", "top"); else if (self.getLocked() === true) { self.emit("locked", "top"); }
else { else {
self.setCallback(function(resp, data) { self.setCallback(function(resp, data) {
@ -517,8 +513,7 @@ POP3Client.prototype.top = function(msgnumber, lines) {
var startOffset = data.indexOf("\r\n", 0) + 2; var startOffset = data.indexOf("\r\n", 0) + 2;
var endOffset = data.indexOf("\r\n.\r\n", 0) + 2; var endOffset = data.indexOf("\r\n.\r\n", 0) + 2;
if (endOffset > startOffset) if (endOffset > startOffset) {returnValue = data.substr(startOffset, endOffset-startOffset); }
returnValue = data.substr(startOffset, endOffset-startOffset);
} }
@ -536,8 +531,8 @@ POP3Client.prototype.list = function(msgnumber) {
var self = this; var self = this;
if (self.getState() !== 2) self.emit("invalid-state", "list"); if (self.getState() !== 2) { self.emit("invalid-state", "list"); }
else if (self.getLocked() === true) self.emit("locked", "list"); else if (self.getLocked() === true) { self.emit("locked", "list"); }
else { else {
self.setLocked(true); self.setLocked(true);
@ -551,7 +546,7 @@ POP3Client.prototype.list = function(msgnumber) {
if (resp !== false) { if (resp !== false) {
returnValue = []; returnValue = [];
var listitem = "";
if (msgnumber !== undefined) { if (msgnumber !== undefined) {
msgcount = 1 msgcount = 1
@ -561,7 +556,6 @@ POP3Client.prototype.list = function(msgnumber) {
} else { } else {
var offset = 0; var offset = 0;
var listitem = "";
var newoffset = 0; var newoffset = 0;
var returnValue = []; var returnValue = [];
var startOffset = data.indexOf("\r\n", 0) + 2; var startOffset = data.indexOf("\r\n", 0) + 2;
@ -573,13 +567,11 @@ POP3Client.prototype.list = function(msgnumber) {
while(true) { while(true) {
if (offset > endOffset) if (offset > endOffset) { break; }
break;
newoffset = data.indexOf("\r\n", offset); newoffset = data.indexOf("\r\n", offset);
if (newoffset < 0) if (newoffset < 0) { break; }
break;
msgcount++; msgcount++;
listitem = data.substr(offset, newoffset-offset); listitem = data.substr(offset, newoffset-offset);
@ -596,8 +588,8 @@ POP3Client.prototype.list = function(msgnumber) {
}); });
if (msgnumber !== undefined) self.setMultiline(false); if (msgnumber !== undefined) { self.setMultiline(false); }
else self.setMultiline(true); else { self.setMultiline(true); }
self.write("LIST", msgnumber); self.write("LIST", msgnumber);
@ -608,8 +600,8 @@ POP3Client.prototype.stat = function() {
var self = this; var self = this;
if (self.getState() !== 2) self.emit("invalid-state", "stat"); if (self.getState() !== 2) { self.emit("invalid-state", "stat"); }
else if (self.getLocked() === true) self.emit("locked", "stat"); else if (self.getLocked() === true) { self.emit("locked", "stat"); }
else { else {
self.setLocked(true); self.setLocked(true);
@ -621,7 +613,7 @@ POP3Client.prototype.stat = function() {
if (resp !== false) { if (resp !== false) {
listitem = data.split(" "); var listitem = data.split(" ");
returnValue = { returnValue = {
"count": listitem[1].trim(), "count": listitem[1].trim(),
@ -644,8 +636,8 @@ POP3Client.prototype.uidl = function(msgnumber) {
var self = this; var self = this;
if (self.getState() !== 2) self.emit("invalid-state", "uidl"); if (self.getState() !== 2) { self.emit("invalid-state", "uidl"); }
else if (self.getLocked() === true) self.emit("locked", "uidl"); else if (self.getLocked() === true) { self.emit("locked", "uidl"); }
else { else {
self.setLocked(true); self.setLocked(true);
@ -658,7 +650,7 @@ POP3Client.prototype.uidl = function(msgnumber) {
if (resp !== false) { if (resp !== false) {
returnValue = []; returnValue = [];
var listitem = "";
if (msgnumber !== undefined) { if (msgnumber !== undefined) {
listitem = data.split(" "); listitem = data.split(" ");
@ -667,7 +659,7 @@ POP3Client.prototype.uidl = function(msgnumber) {
} else { } else {
var offset = 0; var offset = 0;
var listitem = "";
var newoffset = 0; var newoffset = 0;
var returnValue = []; var returnValue = [];
var startOffset = data.indexOf("\r\n", 0) + 2; var startOffset = data.indexOf("\r\n", 0) + 2;
@ -695,8 +687,8 @@ POP3Client.prototype.uidl = function(msgnumber) {
}); });
if (msgnumber !== undefined) self.setMultiline(false); if (msgnumber !== undefined) { self.setMultiline(false); }
else self.setMultiline(true); else { self.setMultiline(true); }
self.write("UIDL", msgnumber); self.write("UIDL", msgnumber);
@ -707,8 +699,8 @@ POP3Client.prototype.retr = function(msgnumber) {
var self = this; var self = this;
if (self.getState() !== 2) self.emit("invalid-state", "retr"); if (self.getState() !== 2) { self.emit("invalid-state", "retr"); }
else if (self.getLocked() === true) self.emit("locked", "retr"); else if (self.getLocked() === true) { self.emit("locked", "retr"); }
else { else {
self.setLocked(true); self.setLocked(true);
@ -740,8 +732,8 @@ POP3Client.prototype.dele = function(msgnumber) {
var self = this; var self = this;
if (self.getState() !== 2) self.emit("invalid-state", "dele"); if (self.getState() !== 2) { self.emit("invalid-state", "dele"); }
else if (self.getLocked() === true) self.emit("locked", "dele"); else if (self.getLocked() === true) { self.emit("locked", "dele"); }
else { else {
self.setLocked(true); self.setLocked(true);
@ -763,8 +755,8 @@ POP3Client.prototype.noop = function() {
var self = this; var self = this;
if (self.getState() !== 2) self.emit("invalid-state", "noop"); if (self.getState() !== 2) { self.emit("invalid-state", "noop"); }
else if (self.getLocked() === true) self.emit("locked", "noop"); else if (self.getLocked() === true) { self.emit("locked", "noop"); }
else { else {
self.setLocked(true); self.setLocked(true);
@ -786,8 +778,8 @@ POP3Client.prototype.rset = function() {
var self = this; var self = this;
if (self.getState() !== 2) self.emit("invalid-state", "rset"); if (self.getState() !== 2) { self.emit("invalid-state", "rset"); }
else if (self.getLocked() === true) self.emit("locked", "rset"); else if (self.getLocked() === true) { self.emit("locked", "rset"); }
else { else {
self.setLocked(true); self.setLocked(true);
@ -809,8 +801,8 @@ POP3Client.prototype.capa = function() {
var self = this; var self = this;
if (self.getState() === 0) self.emit("invalid-state", "quit"); if (self.getState() === 0) { self.emit("invalid-state", "quit"); }
else if (self.getLocked() === true) self.emit("locked", "capa"); else if (self.getLocked() === true) { self.emit("locked", "capa"); }
else { else {
self.setLocked(true); self.setLocked(true);
@ -843,8 +835,8 @@ POP3Client.prototype.quit = function() {
var self = this; var self = this;
if (self.getState() === 0) self.emit("invalid-state", "quit"); if (self.getState() === 0) { self.emit("invalid-state", "quit"); }
else if (self.getLocked() === true) self.emit("locked", "quit"); else if (self.getLocked() === true) { self.emit("locked", "quit"); }
else { else {
self.setLocked(true); self.setLocked(true);

View File

@ -22,7 +22,7 @@
</div> </div>
<div class="form-row"> <div class="form-row">
<label for="node-config-input-tz"><i class="fa fa-clock-o"></i> <span data-i18n="mysql.label.timezone"></span></label> <label for="node-config-input-tz"><i class="fa fa-clock-o"></i> <span data-i18n="mysql.label.timezone"></span></label>
<input type="text" id="node-config-input-tz"> <input type="text" id="node-config-input-tz" placeholder="&#177;hh:mm">
</div> </div>
<div class="form-row"> <div class="form-row">
<label for="node-config-input-charset"><i class="fa fa-language"></i> <span data-i18n="mysql.label.charset"></span></label> <label for="node-config-input-charset"><i class="fa fa-language"></i> <span data-i18n="mysql.label.charset"></span></label>
@ -32,6 +32,7 @@
<label for="node-config-input-name"><i class="fa fa-tag"></i> <span data-i18n="node-red:common.label.name"></span></label> <label for="node-config-input-name"><i class="fa fa-tag"></i> <span data-i18n="node-red:common.label.name"></span></label>
<input type="text" id="node-config-input-name" data-i18n="[placeholder]node-red:common.label.name"> <input type="text" id="node-config-input-name" data-i18n="[placeholder]node-red:common.label.name">
</div> </div>
<div class="form-tips"><span data-i18n="[html]mysql.tip"></span></div>
</script> </script>
<script type="text/javascript"> <script type="text/javascript">

View File

@ -2,7 +2,7 @@
module.exports = function(RED) { module.exports = function(RED) {
"use strict"; "use strict";
var reconnect = RED.settings.mysqlReconnectTime || 20000; var reconnect = RED.settings.mysqlReconnectTime || 20000;
var mysqldb = require('mysql'); var mysqldb = require('mysql2');
function MySQLNode(n) { function MySQLNode(n) {
RED.nodes.createNode(this,n); RED.nodes.createNode(this,n);
@ -41,10 +41,10 @@ module.exports = function(RED) {
timezone : node.tz, timezone : node.tz,
insecureAuth: true, insecureAuth: true,
multipleStatements: true, multipleStatements: true,
connectionLimit: 50, connectionLimit: RED.settings.mysqlConnectionLimit || 50,
timeout: 30000,
connectTimeout: 30000, connectTimeout: 30000,
charset: node.charset charset: node.charset,
decimalNumbers: true
}); });
} }
@ -112,65 +112,41 @@ module.exports = function(RED) {
if (node.mydbConfig.connected) { if (node.mydbConfig.connected) {
if (typeof msg.topic === 'string') { if (typeof msg.topic === 'string') {
//console.log("query:",msg.topic); //console.log("query:",msg.topic);
var bind = []; node.mydbConfig.pool.getConnection(function (err, conn) {
if (Array.isArray(msg.payload)) {
bind = msg.payload;
node.mydbConfig.pool.on('acquire', function(connection) {
connection.config.queryFormat = null;
});
}
else if (typeof msg.payload === 'object' && msg.payload !== null) {
bind = msg.payload;
node.mydbConfig.pool.on('acquire', function(connection) {
connection.config.queryFormat = function(query, values) {
if (!values) {
return query;
}
return query.replace(/\:(\w+)/g, function(txt, key) {
if (values.hasOwnProperty(key)) {
return this.escape(values[key]);
}
return txt;
}.bind(this));
};
});
}
node.mydbConfig.pool.query(msg.topic, bind, function(err, rows) {
if (err) { if (err) {
status = {fill:"red",shape:"ring",text:RED._("mysql.status.error")+": "+err.code}; conn.release()
status = { fill: "red", shape: "ring", text: RED._("mysql.status.error") + ": " + err.code };
node.status(status); node.status(status);
node.error(err,msg); node.error(err, msg);
if (done) { done(); }
return
} }
else {
// if (rows.constructor.name === "OkPacket") { var bind = [];
// msg.payload = JSON.parse(JSON.stringify(rows)); if (Array.isArray(msg.payload)) {
// } bind = msg.payload;
// else if (rows.constructor.name === "Array") {
// if (rows[0] && rows[0].constructor.name === "RowDataPacket") {
// msg.payload = rows.map(v => Object.assign({}, v));
// }
// else if (rows[0] && rows[0].constructor.name === "Array") {
// if (rows[0][0] && rows[0][0].constructor.name === "RowDataPacket") {
// msg.payload = rows.map(function(v) {
// if (!Array.isArray(v)) { return v; }
// v.map(w => Object.assign({}, w))
// });
// }
// else { msg.payload = rows; }
// }
// else { msg.payload = rows; }
// }
// else { msg.payload = rows; }
msg.payload = rows;
send(msg);
status = {fill:"green",shape:"dot",text:RED._("mysql.status.ok")};
node.status(status);
} }
if (done) { done(); } else if (typeof msg.payload === 'object' && msg.payload !== null) {
// if (node.mydbConfig.pool._freeConnections.indexOf(node.mydbConfig.connection) === -1) { bind = msg.payload;
// node.mydbConfig.connection.release(); }
// } conn.config.queryFormat = Array.isArray(msg.payload) ? null : customQueryFormat
}); conn.query(msg.topic, bind, function (err, rows) {
conn.release()
if (err) {
status = { fill: "red", shape: "ring", text: RED._("mysql.status.error") + ": " + err.code };
node.status(status);
node.error(err, msg);
}
else {
msg.payload = rows;
send(msg);
status = { fill: "green", shape: "dot", text: RED._("mysql.status.ok") };
node.status(status);
}
if (done) { done(); }
});
})
} }
else { else {
if (typeof msg.topic !== 'string') { node.error("msg.topic : "+RED._("mysql.errors.notstring")); done(); } if (typeof msg.topic !== 'string') { node.error("msg.topic : "+RED._("mysql.errors.notstring")); done(); }
@ -200,3 +176,15 @@ module.exports = function(RED) {
} }
RED.nodes.registerType("mysql",MysqlDBNodeIn); RED.nodes.registerType("mysql",MysqlDBNodeIn);
} }
function customQueryFormat(query, values) {
if (!values) {
return query;
}
return query.replace(/\:(\w+)/g, function(txt, key) {
if (values.hasOwnProperty(key)) {
return this.escape(values[key]);
}
return txt;
}.bind(this));
}

View File

@ -19,6 +19,7 @@
"notstring": "the query is not defined as a string", "notstring": "the query is not defined as a string",
"notconnected": "Database not connected", "notconnected": "Database not connected",
"notconfigured": "MySQL database not configured" "notconfigured": "MySQL database not configured"
} },
"tip": "Tip: The timezone should be specified as &#177;hh:mm or leave blank for 'local'."
} }
} }

View File

@ -1,9 +1,9 @@
{ {
"name": "node-red-node-mysql", "name": "node-red-node-mysql",
"version": "0.3.0", "version": "1.0.0",
"description": "A Node-RED node to read and write to a MySQL database", "description": "A Node-RED node to read and write to a MySQL database",
"dependencies": { "dependencies": {
"mysql": "^2.18.1" "mysql2": "^2.3.3"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

View File

@ -1,6 +1,6 @@
{ {
"name": "node-red-node-sqlite", "name": "node-red-node-sqlite",
"version": "1.0.1", "version": "1.0.2",
"description": "A sqlite node for Node-RED", "description": "A sqlite node for Node-RED",
"dependencies": { "dependencies": {
"sqlite3": "^5.0.2" "sqlite3": "^5.0.2"

View File

@ -50,6 +50,7 @@ module.exports = function(RED) {
var bind = []; var bind = [];
var doQuery = function(msg) { var doQuery = function(msg) {
bind = []
if (node.sqlquery == "msg.topic") { if (node.sqlquery == "msg.topic") {
if (typeof msg.topic === 'string') { if (typeof msg.topic === 'string') {
if (msg.topic.length > 0) { if (msg.topic.length > 0) {