From 3e538cd1452f17e82afd7212ec2f69b288fe5148 Mon Sep 17 00:00:00 2001 From: Nicholas O'Leary Date: Thu, 19 Sep 2013 14:22:24 +0100 Subject: [PATCH 01/19] Debug sidebar: only display 200 most recent entries --- nodes/core/58-debug.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/nodes/core/58-debug.html b/nodes/core/58-debug.html index 7f188208a..a76f2e82c 100644 --- a/nodes/core/58-debug.html +++ b/nodes/core/58-debug.html @@ -117,6 +117,9 @@ var errornotification = null; + var messageCount = 0; + + function debugConnect() { //console.log("debug ws connecting"); var ws = new WebSocket("ws://"+location.hostname+":"+location.port+document.location.pathname+"/debug"); @@ -160,7 +163,13 @@ (o.topic?''+topic+'':'')+ ''+payload+''; var atBottom = (sbc.scrollHeight-messages.offsetHeight-sbc.scrollTop) < 5; + messageCount++; $(messages).append(msg); + + if (messageCount > 200) { + $("#debug-content .debug-message:first").remove(); + messageCount--; + } if (atBottom) { $(sbc).scrollTop(sbc.scrollHeight); } @@ -176,6 +185,7 @@ $("#debug-tab-clear").click(function() { $(".debug-message").remove(); + messageCount = 0; RED.nodes.eachNode(function(node) { node.highlighted = false; node.dirty = true; From 5390d9bc66486881ad802f7c3e6e1ba2054f0bd8 Mon Sep 17 00:00:00 2001 From: Nicholas O'Leary Date: Thu, 19 Sep 2013 17:01:00 +0100 Subject: [PATCH 02/19] console.log in haste... remove at leisure --- nodes/io/21-httpin.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/nodes/io/21-httpin.js b/nodes/io/21-httpin.js index b0bbd96e3..c6234990f 100644 --- a/nodes/io/21-httpin.js +++ b/nodes/io/21-httpin.js @@ -40,7 +40,6 @@ function HTTPIn(n) { RED.nodes.registerType("http in",HTTPIn); HTTPIn.prototype.close = function() { - console.log(RED.app.routes[this.method]); var routes = RED.app.routes[this.method]; for (var i in routes) { if (routes[i].path == this.url) { @@ -48,6 +47,5 @@ HTTPIn.prototype.close = function() { break; } } - console.log(RED.app.routes[this.method]); } From 62fa61254eaa17a0814ed30cd7953b8cba69130e Mon Sep 17 00:00:00 2001 From: Dave C-J Date: Thu, 19 Sep 2013 20:04:48 +0100 Subject: [PATCH 03/19] retire LevelDB early due to inderlying non-compilation of code issues... --- nodes/{storage => deprecated}/67-leveldb.html | 0 nodes/{storage => deprecated}/67-leveldb.js | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename nodes/{storage => deprecated}/67-leveldb.html (100%) rename nodes/{storage => deprecated}/67-leveldb.js (100%) diff --git a/nodes/storage/67-leveldb.html b/nodes/deprecated/67-leveldb.html similarity index 100% rename from nodes/storage/67-leveldb.html rename to nodes/deprecated/67-leveldb.html diff --git a/nodes/storage/67-leveldb.js b/nodes/deprecated/67-leveldb.js similarity index 100% rename from nodes/storage/67-leveldb.js rename to nodes/deprecated/67-leveldb.js From 8eb2bcbd9c9dabb78dd33e35fb1ee0542fecf6bf Mon Sep 17 00:00:00 2001 From: Dave C-J Date: Fri, 20 Sep 2013 09:11:05 +0100 Subject: [PATCH 04/19] looks like LevelDB has been abandoned on Node :-( searching for simple alternatives --- nodes/deprecated/67-leveldb.html | 114 ------------------------------- nodes/deprecated/67-leveldb.js | 90 ------------------------ 2 files changed, 204 deletions(-) delete mode 100644 nodes/deprecated/67-leveldb.html delete mode 100644 nodes/deprecated/67-leveldb.js diff --git a/nodes/deprecated/67-leveldb.html b/nodes/deprecated/67-leveldb.html deleted file mode 100644 index d779174a1..000000000 --- a/nodes/deprecated/67-leveldb.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/nodes/deprecated/67-leveldb.js b/nodes/deprecated/67-leveldb.js deleted file mode 100644 index e8923d750..000000000 --- a/nodes/deprecated/67-leveldb.js +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright 2013 IBM Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -var RED = require("../../red/red"); -var lvldb = require('leveldb'); - -function LevelNode(n) { - RED.nodes.createNode(this,n); - this.dbname = n.db; - lvldb.open(this.dbname, { create_if_missing: true }, onOpen); - var node = this; - function onOpen(err, db) { - if (err) node.error(err); - node.db = db; - } -} -RED.nodes.registerType("leveldbase",LevelNode); - - -function LevelDBNodeIn(n) { - RED.nodes.createNode(this,n); - this.level = n.level; - this.op = n.op; - this.levelConfig = RED.nodes.getNode(this.level); - - if (this.levelConfig) { - var node = this; - node.on("input", function(msg) { - if (typeof msg.topic === 'string') { - node.levelConfig.db.get(msg.topic, function(err, value) { - if (err) node.error(err); - msg.payload = JSON.parse(value); - delete msg.cmd; - node.send(msg); - }); - } - else { - if (typeof msg.topic !== 'string') node.error("msg.topic (the key is not defined"); - } - }); - } - else { - this.error("LevelDB database name not configured"); - } -} -RED.nodes.registerType("leveldb in",LevelDBNodeIn); - - -function LevelDBNodeOut(n) { - RED.nodes.createNode(this,n); - this.level = n.level; - this.levelConfig = RED.nodes.getNode(this.level); - - if (this.levelConfig) { - var node = this; - node.on("input", function(msg) { - if (typeof msg.topic === 'string') { - console.log(msg); - if (msg.payload === null) { - node.levelConfig.db.del(msg.topic); - } - else { - node.levelConfig.db.put(msg.topic, JSON.stringify(msg.payload), function(err) { - if (err) node.error(err); - }); - } - } - else { - if (typeof msg.topic !== 'string') node.error("msg.topic (the key is not defined"); - } - }); - } - else { - this.error("LevelDB database name not configured"); - } -} -RED.nodes.registerType("leveldb out",LevelDBNodeOut); From 6f8adc9f14cb8289509d054acd2c9ed59d829581 Mon Sep 17 00:00:00 2001 From: Nicholas O'Leary Date: Fri, 20 Sep 2013 14:21:45 +0100 Subject: [PATCH 05/19] Create lib dir on start-up if needed --- red/server.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/red/server.js b/red/server.js index 4475e013e..d0171a956 100644 --- a/red/server.js +++ b/red/server.js @@ -29,7 +29,12 @@ function createServer(_server,settings) { //TODO: relocated user dir var rulesfile = process.argv[2] || 'flows_'+host+'.json'; - + fs.exists("lib/",function(exists) { + if (!exists) { + fs.mkdir("lib"); + } + }); + app.get("/nodes",function(req,res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.write(redNodes.getNodeConfigs()); From 9c939d1a58ea970663d6d4b6d5a2bf6f25afd55e Mon Sep 17 00:00:00 2001 From: Nicholas O'Leary Date: Fri, 20 Sep 2013 14:31:08 +0100 Subject: [PATCH 06/19] Updates to package.json --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 94d324ee0..ed3f1fe9a 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "start": "node red.js" }, "main": "lib/server.js", - "author": "Nicholas O'Leary", + "author": "Nick O'Leary", "contributors": [ {"name": "Dave Conway-Jones"} ], "keywords": ["editor", "messaging", "iot", "m2m", "pi", "arduino", "beaglebone", "ibm"], "license": "Apache", @@ -17,5 +17,6 @@ "mustache": "*", "cron":"*" }, - "engines": { "node": ">=0.8" } + "engines": { "node": ">=0.8" }, + "repository": {"type":"git","url":"https://github.com/node-red/node-red.git"} } From b6ba859510720dbba36ea858f59a432b22ad663d Mon Sep 17 00:00:00 2001 From: Nicholas O'Leary Date: Fri, 20 Sep 2013 14:34:03 +0100 Subject: [PATCH 07/19] Add homepage to package.json --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ed3f1fe9a..0ffacac61 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,8 @@ { "name": "node-red", "version": "0.1.0", - "description" : "A visual tool for wiring the Internet of Things", + "description": "A visual tool for wiring the Internet of Things", + "homepage": "http://nodered.org", "scripts": { "start": "node red.js" }, From 7348e475eb3c7d3ecdf43fc1d8b7b452defbe1cf Mon Sep 17 00:00:00 2001 From: Nicholas O'Leary Date: Fri, 20 Sep 2013 16:52:07 +0100 Subject: [PATCH 08/19] Fix null mouse_position on node import --- public/red/ui/view.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/public/red/ui/view.js b/public/red/ui/view.js index 040ffa7af..cddbb4a0a 100644 --- a/public/red/ui/view.js +++ b/public/red/ui/view.js @@ -857,7 +857,11 @@ RED.view = function() { var root_node = new_ms[0].n; var dx = root_node.x; var dy = root_node.y; - + + if (mouse_position == null) { + mouse_position = [0,0]; + } + for (var i in new_ms) { new_ms[i].n.selected = true; new_ms[i].n.x -= dx - mouse_position[0]; From 0ecbbca7e496df2c7949439f540927d502aea95a Mon Sep 17 00:00:00 2001 From: Nicholas O'Leary Date: Fri, 20 Sep 2013 17:15:45 +0100 Subject: [PATCH 09/19] Restructure server code to make embedding easier --- red.js | 10 ++-- red/library.js | 141 +++++++++++++++++++++++++------------------------ red/nodes.js | 9 +++- red/red.js | 18 +++++-- red/server.js | 17 +++--- 5 files changed, 109 insertions(+), 86 deletions(-) diff --git a/red.js b/red.js index b3ea64e8a..ae7d46d0f 100644 --- a/red.js +++ b/red.js @@ -19,20 +19,18 @@ var util = require("util"); var express = require("express"); var crypto = require("crypto"); var settings = require("./settings"); +var RED = require("./red/red.js"); + var server; var app = express(); -var redApp = null; - if (settings.https) { server = https.createServer(settings.https,function(req,res){app(req,res);}); } else { server = http.createServer(function(req,res){app(req,res);}); } -redApp = require('./red/server.js').init(server,settings); - settings.httpRoot = settings.httpRoot||"/"; if (settings.httpRoot[0] != "/") { @@ -51,9 +49,11 @@ if (settings.httpAuth) { ); } -app.use(settings.httpRoot,redApp); +RED.init(server,settings); +app.use(settings.httpRoot,RED.app); server.listen(settings.uiPort); +RED.start(); util.log('[red] Server now running at http'+(settings.https?'s':'')+'://127.0.0.1:'+settings.uiPort+settings.httpRoot); diff --git a/red/library.js b/red/library.js index 0907011be..99b9d5698 100644 --- a/red/library.js +++ b/red/library.js @@ -16,78 +16,80 @@ var fs = require("fs"); var fspath = require("path"); -var redUI = require("./server"); +var redApp = null; -// -------- Flow Library -------- -redUI.app.post(new RegExp("/library/flows\/(.*)"), function(req,res) { - var fullBody = ''; - req.on('data', function(chunk) { - fullBody += chunk.toString(); - }); - req.on('end', function() { - var fn = "lib/flows/"+req.params[0]+".json"; - var parts = fn.split("/"); - for (var i = 3;i 0) { result.d = dirs; } + if (files.length > 0) { result.f = files; } + return result; + } + + redApp.get("/library/flows",function(req,res) { + var flows = {}; + if (fs.existsSync("lib/flows")) { + flows = listFiles("lib/flows"); + } else { + fs.mkdirSync("lib/flows"); + } + res.writeHead(200, {'Content-Type': 'text/plain'}); + res.write(JSON.stringify(flows)); + res.end(); + + }); + + redApp.get(new RegExp("/library/flows\/(.*)"), function(req,res) { + var fn = "lib/flows/"+req.params[0]+".json"; + if (fs.existsSync(fn)) { + fs.readFile(fn,function(err,data) { + res.writeHead(200, {'Content-Type': 'text/plain'}); + res.write(data); res.end(); }); - - }); -}); - -function listFiles(dir) { - var dirs = {}; - var files = []; - var dirCount = 0; - fs.readdirSync(dir).sort().filter(function(fn) { - var stats = fs.lstatSync(dir+"/"+fn); - if (stats.isDirectory()) { - dirCount += 1; - dirs[fn] = listFiles(dir+"/"+fn); } else { - files.push(fn.split(".")[0]); + res.send(404); } }); - var result = {}; - if (dirCount > 0) { result.d = dirs; } - if (files.length > 0) { result.f = files; } - return result; -} - -redUI.app.get("/library/flows",function(req,res) { - var flows = {}; - if (fs.existsSync("lib/flows")) { - flows = listFiles("lib/flows"); - } else { - fs.mkdirSync("lib/flows"); - } - res.writeHead(200, {'Content-Type': 'text/plain'}); - res.write(JSON.stringify(flows)); - res.end(); - -}); - -redUI.app.get(new RegExp("/library/flows\/(.*)"), function(req,res) { - var fn = "lib/flows/"+req.params[0]+".json"; - if (fs.existsSync(fn)) { - fs.readFile(fn,function(err,data) { - res.writeHead(200, {'Content-Type': 'text/plain'}); - res.write(data); - res.end(); - }); - } else { - res.send(404); - } -}); - -// ------------------------------ - + + // ------------------------------ +} function createLibrary(type) { @@ -96,11 +98,11 @@ function createLibrary(type) { var root = fspath.join("lib",type)+"/"; fs.exists(root,function(exists) { - if (!exists) { - fs.mkdir(root); - } + if (!exists) { + fs.mkdir(root); + } }); - redUI.app.get(new RegExp("/library/"+type+"($|\/(.*))"),function(req,res) { + redApp.get(new RegExp("/library/"+type+"($|\/(.*))"),function(req,res) { var path = req.params[1]||""; var rootPath = fspath.join(root,path); @@ -141,7 +143,7 @@ function createLibrary(type) { }); }); - redUI.app.post(new RegExp("/library/"+type+"\/(.*)"),function(req,res) { + redApp.post(new RegExp("/library/"+type+"\/(.*)"),function(req,res) { var path = req.params[0]; var fullBody = ''; req.on('data', function(chunk) { @@ -246,4 +248,5 @@ function getFileBody(root,path,res) { res.end(); } +module.exports.init = init; module.exports.register = createLibrary; diff --git a/red/nodes.js b/red/nodes.js index 7f1b1d426..b60c647a8 100644 --- a/red/nodes.js +++ b/red/nodes.js @@ -66,7 +66,11 @@ var registry = (function() { events.emit("nodes-stopped"); nodes = {}; }, - + each: function(cb) { + for (var n in nodes) { + cb(nodes[n]); + } + }, addLogHandler: function(handler) { logHandlers.push(handler); } @@ -132,6 +136,7 @@ util.inherits(Node,EventEmitter); Node.prototype.close = function() { // called when a node is removed + this.emit("close"); } @@ -325,7 +330,7 @@ var parseConfig = function() { util.log("[red] unknown type: "+activeConfig[i].type); } } - + // Clean up any orphaned credentials var deletedCredentials = false; for (var c in credentials) { diff --git a/red/red.js b/red/red.js index 7ff626b52..4037f70ec 100644 --- a/red/red.js +++ b/red/red.js @@ -18,18 +18,28 @@ var events = require("./events"); var server = require("./server"); var nodes = require("./nodes"); var library = require("./library"); -var settings = require("../settings"); +var settings = null; var events = require("events"); var RED = { + + init: function(httpServer,userSettings) { + settings = userSettings; + server.init(httpServer,settings); + library.init(); + }, + + start: server.start, + nodes: nodes, - app: server.app, - server: server.server, - settings: settings, library: library, events: events }; +RED.__defineGetter__("app", function() { return server.app }); +RED.__defineGetter__("server", function() { return server.server }); +RED.__defineGetter__("settings", function() { return settings }); + module.exports = RED; diff --git a/red/server.js b/red/server.js index d0171a956..38b9b013d 100644 --- a/red/server.js +++ b/red/server.js @@ -19,6 +19,8 @@ var util = require('util'); var createUI = require("./ui"); var redNodes = require("./nodes"); var host = require('os').hostname(); +//TODO: relocated user dir +var rulesfile = process.argv[2] || 'flows_'+host+'.json'; var app = null; var server = null; @@ -28,7 +30,6 @@ function createServer(_server,settings) { app = createUI(settings); //TODO: relocated user dir - var rulesfile = process.argv[2] || 'flows_'+host+'.json'; fs.exists("lib/",function(exists) { if (!exists) { fs.mkdir("lib"); @@ -70,7 +71,8 @@ function createServer(_server,settings) { }); }); }); - +} +function start() { console.log("\nWelcome to Node-RED\n===================\n"); util.log("[red] Loading palette nodes"); util.log("------------------------------------------"); @@ -83,20 +85,23 @@ function createServer(_server,settings) { util.log(' npm install {the module name}'); util.log('or any other errors are resolved'); util.log("------------------------------------------"); - + fs.exists(rulesfile, function (exists) { if (exists) { - util.log("[red] Loading workspace flow : "+rulesfile); + util.log("[red] Loading flows : "+rulesfile); fs.readFile(rulesfile,'utf8',function(err,data) { redNodes.setConfig(JSON.parse(data)); }); + } else { + util.log("[red] Flows file not found : "+rulesfile); } }); - return app; } + module.exports = { - init: createServer + init: createServer, + start: start } module.exports.__defineGetter__("app", function() { return app }); From 019a4ff3973dd136b1790f76086603a36321a52b Mon Sep 17 00:00:00 2001 From: Dave C-J Date: Mon, 23 Sep 2013 08:28:40 +0100 Subject: [PATCH 10/19] Patch for serial node - if no delimiter selected then it was holding onto the last character in the buffer. --- nodes/io/25-serial.js | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/nodes/io/25-serial.js b/nodes/io/25-serial.js index 1d61758fb..163975fdf 100644 --- a/nodes/io/25-serial.js +++ b/nodes/io/25-serial.js @@ -123,10 +123,18 @@ var serialPool = function() { } newline = newline.replace("\\n","\n").replace("\\r","\r"); var setupSerial = function() { - obj.serial = new serialp.SerialPort(port,{ - baudrate: baud, - parser: serialp.parsers.readline(newline) - }); + if (newline == "") { + obj.serial = new serialp.SerialPort(port,{ + baudrate: baud, + parser: serialp.parsers.raw + }); + } + else { + obj.serial = new serialp.SerialPort(port,{ + baudrate: baud, + parser: serialp.parsers.readline(newline) + }); + } obj.serial.on('error', function(err) { util.log("[serial] serial port "+port+" error "+err); obj.tout = setTimeout(function() { @@ -147,7 +155,15 @@ var serialPool = function() { obj._emitter.emit('ready'); }); obj.serial.on('data',function(d) { + if (typeof d !== "string") { + d = d.toString(); + for (i=0; i Date: Tue, 24 Sep 2013 18:45:02 +0100 Subject: [PATCH 11/19] Fix R-Pi gpio node to not use reset - just set all io to input on start instead... --- nodes/hardware/36-rpi-gpio.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/nodes/hardware/36-rpi-gpio.js b/nodes/hardware/36-rpi-gpio.js index 7ae3ffb21..de73f11fd 100644 --- a/nodes/hardware/36-rpi-gpio.js +++ b/nodes/hardware/36-rpi-gpio.js @@ -117,15 +117,17 @@ function GPIOOutNode(n) { } } -exec("gpio reset",function(err,stdout,stderr) { +exec("gpio mode 0 in",function(err,stdout,stderr) { if (err) { - util.log('[36-rpi-gpio.js] Error: "gpio reset" command failed for some reason.'); + util.log('[36-rpi-gpio.js] Error: "gpio" command failed for some reason.'); } - exec("gpio load spi",function(err,stdout,stderr) { - if (err) { - util.log('[36-rpi-gpio.js] Error: "gpio load spi" command failed for some reason.'); - } - + exec("gpio mode 1 in"); + exec("gpio mode 2 in"); + exec("gpio mode 3 in"); + exec("gpio mode 4 in"); + exec("gpio mode 5 in"); + exec("gpio mode 6 in"); + exec("gpio mode 7 in",function(err,stdout,stderr) { RED.nodes.registerType("rpi-gpio in",GPIOInNode); RED.nodes.registerType("rpi-gpio out",GPIOOutNode); From c95fc633e30a4714ac152bda41185084e6718e3e Mon Sep 17 00:00:00 2001 From: Dave C-J Date: Tue, 24 Sep 2013 18:45:47 +0100 Subject: [PATCH 12/19] remove/hide some over zealous warn messages from blinkstick --- nodes/hardware/76-blinkstick.js | 2 +- public/icons/db.png | Bin 0 -> 558 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 public/icons/db.png diff --git a/nodes/hardware/76-blinkstick.js b/nodes/hardware/76-blinkstick.js index bf5d72027..87feea64f 100644 --- a/nodes/hardware/76-blinkstick.js +++ b/nodes/hardware/76-blinkstick.js @@ -48,7 +48,7 @@ function BlinkStick(n) { } } else { - node.warn("No BlinkStick found"); + //node.warn("No BlinkStick found"); node.led = blinkstick.findFirst(); } } diff --git a/public/icons/db.png b/public/icons/db.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7f703a7d01127d1e5925f46b862cc66e623484 GIT binary patch literal 558 zcmV+}0@3}6P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*x2 z3WXevA*k`Xq?pe~92W`T?#t z&hf!kGPCW>h@!IWfik6&oF-|T1lVGWO@<^(-$v2_$upI4E@>&LiF!ql+>>;v5g>Ub zY0*cvE9q8W0Lgojvzp7tQ8;a4Bu$b>*E*ypk*6gT=5A&NKuJcDU}l!YWM=#%`H%$w zcpzKlpJtZVEa+I8WSM-3kI@+Ko^r4}TiA+B_PFF_i_pyGiFgV??#{N}hnOU|yYjUG zFfS5HdQH<8Njm`G?#fo>xFxbVfGq!7Bn0pltbIy{xHL26LGmERyQ>EPO@%z;q2P8G zzIJV5ki+R!nMyKw%`2DO0Zh_}>k|MIl0Imzr01G7VFML5f2ze0J=RK+;)|%E8JXS2 zaIIbJ*-zwE|LH{iZNmIyN1yVqTiCre|1XArL)e!XQf<)~!k9U#r0JiP^tvy_3yM|J z-h5anqdBu!axcpDmeJTboOBC)u7)J78{<&uPy1StJCa}NM(!oeYJ^5|LGpTlbd|n0 wlJ*DNIg(S7ha@k0nxrF=)4_Ibi!C+ Date: Tue, 24 Sep 2013 20:38:37 +0100 Subject: [PATCH 13/19] Added delete to MongoDB node --- nodes/storage/66-mongodb.html | 12 +++++++++++- nodes/storage/66-mongodb.js | 29 ++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/nodes/storage/66-mongodb.html b/nodes/storage/66-mongodb.html index 4737d2e7e..f4704e537 100644 --- a/nodes/storage/66-mongodb.html +++ b/nodes/storage/66-mongodb.html @@ -105,6 +105,13 @@ +
+ + +
@@ -114,7 +121,9 @@ @@ -52,7 +57,14 @@
-
+
+ + +
+
@@ -61,6 +73,13 @@
+