React/ReactJS and CouchDB (w/ Nano)
You must already be aware of the basic CRUD (Create Read Update Delete) operations that can be performed in CouchDB using Fauxton and/or cURL.
However, integrating CouchDB with other language/framework often necessitates the CRUD operations to be performed programmatically.
For example, if you need to display the info of your CouchDB (up at the usual http://localhost:5984) in your ReactJS component, you need to fetch it programmatically.
axios.get('http://localhost:5984')
.then(json => console.log(json))
If the server is running, it will give the response:
data: {
couchdb: "Welcome",
vendor: {name: "The Apache Software Foundation"},
version:"2.0.0"
}
In this tutorial, we will learn how to perform basic CRUD operations in CouchDB programmatically from ReactJS using nano, a minimalistic CouchDB driver for Node.js. The other popular CouchDB client for Node.js is cradle, but for this tutorial I have picked nano.
Install nano at the root directory of your project.
npm install --save nano
We will begin by fetching data from an existing CouchDB document. But before we proceed, we need to do some CORS configuration in Fauxton for the hostname (and port) where ReactJS is running.
If your Fauxton is up at http://localhost:5984, go to Config and click on the CORS tab. In the Origin Domains section, you will find the "Restrict to specific domains" button checked by default. If your ReactJS is running at the usual port :3000
in your localhost, type http://localhost:3000
in the input box and click " Add Domain".
1. Fetch a CouchDB Document
In one of our previous tutorials on CouchDB, we created two documents inside the books
database, with IDs 2a0580eb69d3153841a74f29c9007d16
and 02
. We will fetch the details of the first document with ID 2a0580eb69d3153841a74f29c9007d16
.
The nano query for this is:
const nano = require('nano')('http://localhost:5984');
nano.db.use('books').get('2a0580eb69d3153841a74f29c9007d16')
.then((body) => {
console.log(body);
});
If the query is successful, we get the following response in the browser's console:
{
author:"David Lindsay"
title:"A Voyage to Arcturus"
_id:"2a0580eb69d3153841a74f29c9007d16"
_rev:"2-8d77d98a6b66bc8829f5d2d9fd159eb4"
}
2. Create Database in CouchDB
We next get into creating a new database called cars
:
const nano = require('nano')('http://localhost:5984');
nano.db.create('cars', function(err, body) {
if (!err) {
console.log(body);
}
});
On successful creation of database, we get the below response in the console:
{ok: true}
If you refresh http://localhost:5984/_utils/#_all_dbs you will find the new database listed in the bottom row.
3. Create Document in CouchDB Database
Now we can store some document data inside our newly created database cars
.
We will store the following JSON key-value pair as a document inside it.
{
name:"Koenigsegg Regera"
}
Usually, CouchDB auto-generates a UUID for the document, but we can also specify our own ID for it. Here we assign the ID koenigsegg
for the document while creating it:
const nano = require('nano')('http://localhost:5984');
nano.use('cars').insert({id:'koenigsegg', name:'Koenigsegg Regera'},
function(err, body) {
if (!err)
console.log(body);
});
The document ID can also be passed as a second argument to the insert()
function:
const nano = require('nano')('http://localhost:5984');
nano.use('cars').insert({ name: 'Koenigsegg Regera' }, 'koenigsegg',
function(err, body) {
if (!err)
console.log(body);
});
On successful creation of document, we get the response:
{
id:"koenigsegg"
ok:true
rev:"1-897c1910cca82e5a8ddfd4d70888d449"
}
4. Update Document in CouchDB Database
Now suppose you want to change the value of the name
field in the above document; say, you want to replace the value Koenigsegg Regera
with Koenigsegg Agera RS
. You can still use the insert()
document function as above when creating a document, but you need to include another token _rev
in the query object:
let obj = {
_id: 'koenigsegg',
_rev: '1-897c1910cca82e5a8ddfd4d70888d449',
name: 'Koenigsegg Agera RS'
};
const nano = require('nano')('http://localhost:5984');
nano.use('cars').insert(obj, function(err, body) {
if (!err)
console.log(body);
});
Notice that the rev
value has changed.
{
id:"koenigsegg"
ok:true
rev:"2-0e70e8016b800d269a764fc18a1466bb"
}
5. Delete Document from a CouchDB Database
The koenigsegg
document can be removed from the cars
database by providing its id
and rev
fields as arguments to the destroy()
function:
const nano = require('nano')('http://localhost:5984');
nano.use('cars').destroy('koenigsegg', '2-0e70e8016b800d269a764fc18a1466bb',
function(err, body) {
if (!err)
console.log(body);
});
The rev
field will still show a new value in the response, despite the document being already removed from the database.
{
id:"koenigsegg"
ok:true
rev:"3-e75edfe61b0ea16bc11fe5b2051e6809"
}
6. Delete Database from CouchDB
The destroy()
method is used to remove a database too:
const nano = require('nano')('http://localhost:5984');
nano.db.destroy('cars');