0

我是 Node 和 CouchDb 的新手,我正在尝试使用它。我正在努力使一段代码工作。我想创建一个表users,插入一个新用户并“同时”获取另一个用户。

启动时出现此错误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)

这是我的代码,有什么问题吗?(当我删除 getDoc 函数时,错误消失了)我正在使用 couchDB 1.0.1 和节点 0.6.12

和文档已经存在于数据库中jdoe4jdoeusers

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');
    });

});
4

2 回答 2

0

我很快意识到 felix-couchdb 与节点 8 不兼容(我知道你没有使用版本 8,但总有一天你会使用),所以我切换到 nano couchdb,下面是以下代码:

  1. 它将检查数据库是否已创建
  2. 仅当给定的键是唯一的时才会插入
  3. 它将获得用户的密钥

    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');
    });
    
    });
    

值得注意的一点是,虽然这将“同时”获取它们,但它仍然向数据库发出 3 个请求,1 个检查它是否存在,1 个插入(或不插入),1 个获取。

于 2012-07-31T15:16:53.223 回答
0

这似乎是一个库问题 => Github Issue Socket Hangout

如果您不知道哪个库更适合您的需求,请看这里。

于 2012-07-31T14:43:57.180 回答