Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当“时抛出错误”;新的CouchDB.数据库(queueDb)&引用;第二次_Javascript_Node.js_Meteor_Couchdb_Cloudant - Fatal编程技术网

Javascript 当“时抛出错误”;新的CouchDB.数据库(queueDb)&引用;第二次

Javascript 当“时抛出错误”;新的CouchDB.数据库(queueDb)&引用;第二次,javascript,node.js,meteor,couchdb,cloudant,Javascript,Node.js,Meteor,Couchdb,Cloudant,我正在使用meteor couchdb,并试图在进行API调用时连接到db并执行所需的操作 dbName = new CouchDB.Database('db_name'); 但当再次调用API时,它抛出以下错误 Error: A method named '/db_name/insert' is already defined 根据API调用,我应该能够选择需要连接的Db。 我试着用节点的方式做 Cloudant.use('db_name'); 但由于Meteor是我的服务器端框架,我需

我正在使用meteor couchdb,并试图在进行API调用时连接到db并执行所需的操作

dbName = new CouchDB.Database('db_name');
但当再次调用API时,它抛出以下错误

Error: A method named '/db_name/insert' is already defined
根据API调用,我应该能够选择需要连接的Db。 我试着用节点的方式做

Cloudant.use('db_name');
但由于Meteor是我的服务器端框架,我需要使用async await或Meteor.wrapAsync()同步处理异步函数


连接db并执行操作的建议方法是什么,每当进行API调用时?

如果我正确理解meteor CouchDB实现,它将连接到一个db服务器,并允许您使用多个数据库,因此无论您调用多少次新CouchDB.Database(“db_名称”),基本上都只有一个到服务器的连接

你应该做的是:

// tasks.js
// create an instance of Tasks database only once 
var Tasks = new CouchDB.Database('tasks');
// you may want to export it so you can use it elsewhere
exports.Tasks = Tasks;

// blabla.js
// in another file require the file
var Tasks = require('path/to/tasks.js').Tasks;
// and use it when needed
Tasks.find();
回答下面评论的附加代码

您可以有一个文件,我们称之为
dbs.js
,它可以为您处理动态创建dbs的过程

var dbs = {};

exports.getDb = function(name){
    if (!dbs[name])
        dbs[name] = new CouchDB.Database(name);

    return dbs[name];
};
那你想用在哪里就用在哪里

var Tasks = require('dbs.js').getDb('Tasks');
Tasks.find();

您应该调用
dbName=newcouchdb.Database('db_name')仅一次,并重用连接,而不是创建新连接。由于不需要每次有api调用时都创建新连接,因此还可以节省几毫秒的时间。Node.js应用程序通常是长时间运行的进程,所以持久连接非常有意义。但是我需要根据API调用连接到不同的cloudant数据库。meteor启动时我是否应该连接所有dbs?在这种情况下,如果添加了一个新的DB,meteor将如何获得新创建的DB的实例?是的,您理解得对。但是如果我有100个像“任务”这样的数据库,那么我就不能写100个这样的文件。如果我们可以列出特定cloudant帐户中的所有数据库,并在初始化meteor服务器时连接到该帐户,那么即使动态创建的数据库也不会被列出。每次添加新数据库时,我可能都必须停止服务器并重新启动,或者我应该在Cloudant上有一个更新数据库列表的手表。@AnnopGoudar我添加了动态创建数据库的代码。希望能有帮助。但是当您调用新的CouchDB.Database(dbname)时,这会失败;第二次,如果dbname相同。结果如下:一个名为“/db\u name/insert”的方法已经定义了为什么要再次调用
new CouchDB.Database
?通过使用
require('dbs.js').getDb('Tasks')
创建数据库实例(如果这是您第一次调用它),或者返回已经存在的实例。