diff --git a/README.md b/README.md new file mode 100644 index 0000000..af5762c --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# CouchDB nodes Node-RED +Accessor nodes for Apache CouchDB from Node-RED. + +## Installation +Use `npm install node-red-contrib-couchdb` to install. + +## Usage +This package provides some nodes that can be used in conjunction with an Apache CouchDB. Specifically, +we can insert new documents and query/retrieve existing documents. For the insertion, we supply the +JavaScript document in the `msg.payload` property which could include the `_id` property to +provide the identity. If we are updating the document, then a valid `_rev` property should also be present. + +For a query/retrieval, we have the choice of either retrieving by id value or by a design document view search. +For an id, specify the `_id` value as the `msg.payload`. For a design document view retrieval, supply +the search key in `msg.payload`. + +In both cases, the document is returned as the output `msg.payload`. + +To connect to the database, the URL for the CouchDB server should be supplied along with the database name for +the database to be accessed. + + +## Contributing +1. Fork it! +2. Create your feature branch: `git checkout -b my-new-feature` +3. Commit your changes: `git commit -am 'Add some feature'` +4. Push to the branch: `git push origin my-new-feature` +5. Submit a pull request + +## History +* 2015-03-04 - First release + +## Credits +Neil Kolban + +## License +Apache 2.0 \ No newline at end of file diff --git a/couchdb.html b/couchdb.html index ecd3653..3e575fa 100644 --- a/couchdb.html +++ b/couchdb.html @@ -20,7 +20,7 @@ inputs: 1, outputs: 1, icon: "db.png", - color: "#3FADB5", + color: "#73c5e7", label: function () { return this.name || "couchdb" }, @@ -39,17 +39,52 @@ }, retrievalType: { value: "byId" + }, + designDoc: { + value: null + }, + viewName: { + value: null + } + } + }); + + RED.nodes.registerType('couchdbinsert',{ + // node definition + category: "storage", + inputs: 1, + outputs: 0, + icon: "db.png", + color: "#73c5e7", + label: function () { + return this.name || "couchdb insert" + }, + paletteLabel: "couchdb insert", + align: "right", + defaults: { + name: { + value: "" + }, + serverUrl: { + value: "", + required: true + }, + database: { + value: "", + required: true } } }); + + + + + + + \ No newline at end of file diff --git a/couchdb.js b/couchdb.js index f8e11d2..b2397bb 100644 --- a/couchdb.js +++ b/couchdb.js @@ -21,7 +21,9 @@ * * database - The name of the database * * retrievalType - How we should retrieve a document * * byId - * * ??? + * * byView + * * designDoc - The name of the design document + * * viewName - The name of a view * This module makes extensive use of the project called "dscape/nano" * found on Github at: * @@ -30,25 +32,62 @@ * */ module.exports = function(RED) { +/** + * The CouchDBNode provides the implementation for retrieving data from the CouchDB + * database. + */ function CouchDBNode(config) { - console.log("CouchDBNode: config: " + JSON.stringify(config)); + var thisNode = this; var nano = require("nano")(config.serverUrl); var db = nano.use(config.database); - this.on('input', function(msg) { + + this.on("input", function(msg) { // Process the request here - db.get(msg.payload, function(err, body) { - console.log("We got a document: " + body); - if (!err) { - msg.payload = body; - thisNode.send(msg); - } - }); - console.log("Process message: " + JSON.stringify(msg)); - }); + if (config.retrievalType == "byId") { + db.get(msg.payload, function(err, body) { + if (!err) { + msg.payload = body; + thisNode.send(msg); + } + }); // End of db.get + } // End of byId + else if (config.retrievalType == "byView") { + db.view(config.designDoc, config.viewName, { + key: msg.payload, + include_docs: true + }, function(err, body) { + if (!err) { + msg.payload = body.rows; + thisNode.send(msg); + } + }); // End of db.view + } // End of byView + }); // End of on "input" RED.nodes.createNode(thisNode, config); - } // End of couchDBNode definition + } // End of CouchDBNode definition + +/** + * Insert data into the database + * * serverUrl - The URL to reach the CouchDB server ... eg. http://localhost:5984 + * * database - The name of the database + */ + function CouchDBInsertNode(config) { + var thisNode = this; + var nano = require("nano")(config.serverUrl); + var db = nano.use(config.database); + this.on("input", function(msg) { + // Process the insertion request here + db.insert(msg.payload, function(err, body) { + // Nothing to do on the callback + if (err) { + thisNode.warn("[" + config.type + ":" + config.name + "]: Error: " + JSON.stringify(err)); + } + }); // End of db.insert + }); // End of on "input" + } // End of CouchDBInsertNode RED.nodes.registerType("couchdb", CouchDBNode); -} + RED.nodes.registerType("couchdbinsert", CouchDBInsertNode); +} // End of module.exports // End of file \ No newline at end of file diff --git a/tests/test-nano.js b/tests/test-nano.js index 0299ec2..83fedb6 100644 --- a/tests/test-nano.js +++ b/tests/test-nano.js @@ -1,12 +1,21 @@ // Test our understanding of nano var docId = "56d8e35efaa2604f06173dc5"; +var design = "dd1"; +var view = "company"; var nano = require("nano")("http://localhost:5984"); var test1 = nano.use("test1"); +/* test1.get(docId, function(err, body, header) { dump(err, body, header); console.log("Got something!"); }); +*/ +test1.view(design, view, {key: "MOTOVATE", include_docs: true}, function(err, body, header) { + dump(err, body, header); + console.log("Got something!"); +}); + console.log("test-nanon: Core completed"); function dump(err, body, header) {