0

I'm new to Node and CouchDb and I'm trying to get my hands on it. I'm struggling to make a piece of code to work. I would like to create a table users, insert a new user and 'at the same time' getting another user.

I'm getting this error when starting up node app.js :

antoine@ubuntu:~/projects/couchDb$ node app.js 
Database users exists.
{"error":"conflict","reason":"Document update conflict."}
Leaving saveDoc

events.js:48
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: socket hang up
    at createHangUpError (http.js:1107:15)
    at Socket.onend (http.js:1188:27)
    at TCP.onread (net.js:369:26)

And here is my very code, is there something wrong? (When I remove the getDoc function the error goes away) I'm using couchDB 1.0.1 and node 0.6.12

The jdoe4 and jdoe documents are already present in the users database.

var dbHost = "127.0.0.1";
var dbPort = 5984;
var dbName = 'users';

var couchdb = require('felix-couchdb');
var client = couchdb.createClient(dbPort, dbHost);

var user = {
  name: {
    first: 'John',
    last: 'Doe'
  }
}

var db = client.db(dbName);

db.exists(function(err, exists) {
  if (!exists) {
    db.create();
    console.log('Database ' + dbName + ' created.');
  } else {
    console.log('Database ' + dbName + ' exists.');
  }

  db.saveDoc('jdoe4', user, function(err, doc) {
    if( err) {
          console.log(JSON.stringify(err));
        } else {
          console.log('Saved user.');
        }
        console.log('Leaving saveDoc');
    });

    db.getDoc('jdoe', function(err,doc) {
        if( err) {
            console.log(JSON.stringify(err));
        } else {
            console.log(JSON.stringify(doc));
        }
        console.log('Leaving getDoc');
    });

});
Tinou
  • 5,908
  • 4
  • 21
  • 24

2 Answers2

0

It seems to be a library problem => Github Issue Socket Hangout

Look here if you dont know which library fit more your needs.

Community
  • 1
  • 1
Vodun
  • 1,377
  • 1
  • 10
  • 12
0

I quickly realized that felix-couchdb is not compatible with node 8 (I know you're not using version 8, but you will someday), so I switched to nano couchdb and here's the following code:

  1. It will check if the db is created
  2. It will insert only if the key given is unique
  3. It will get the user with a key

    var couchdb = require('nano')('http://localhost:5984')
      , dbName = 'users'
      , db = couchdb.use(dbName)
      ;
    
    var user = {
        name: {
            first: 'John',
            last: 'Doe'
        }
    }
    
    couchdb.db.create(dbName, function(err, db_body) {
    
    db.insert(user, 'jdoe4', function(err, doc, header) {
        if( err) {
          console.log('Cannot save user');
        } else {
          console.log('Saved user.');
        }
        console.log('Leaving saveDoc');
    });
    
    db.get('jdoe', function(err, doc) {
        if( err) {
            console.log('Cannot get user');
        } else {
            console.log(JSON.stringify(doc));
        }
        console.log('Leaving getDoc');
    });
    
    });
    

One thing worth noting is that, while this will get them at the "same time," it's still making 3 requests to the db, 1 to check if it exists, 1 to insert (or not), 1 to get.

film42
  • 1,095
  • 12
  • 22