Выдает ошибку, когда «new CouchDB.Database (queueDb);» во второй раз

1

Я использую meteor-couchdb и пытаюсь подключиться к db при вызове API и выполнить требуемую операцию.

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 wait или Meteor.wrapAsync().

Каким будет предлагаемый подход для подключения к db и выполнения действий при каждом вызове API?

  • 0
    Вы должны вызвать dbName = new CouchDB.Database('db_name'); только один раз и повторно используйте соединение вместо создания нового. Вы также экономите несколько миллисекунд, поскольку вам не нужно создавать новое соединение каждый раз, когда происходит вызов API. Приложения Node.js обычно долго выполняются, поэтому постоянное соединение имеет большой смысл.
  • 0
    Но мне нужно подключиться к различным облачным базам данных на основе вызовов API. Должен ли я подключаться ко всем базам данных при запуске метеорита? В этом случае, если будет добавлена новая БД, как метеор получит экземпляр вновь созданной БД?
Теги:
meteor
couchdb
cloudant

1 ответ

2
Лучший ответ

Если я правильно понимаю реализацию метеор CouchDB, он подключается к одному серверу db и позволяет работать с несколькими базами данных, поэтому необходимо одно единственное подключение к серверу независимо от того, сколько раз вы вызываете new CouchDB.Database('db_name');

Вы должны сделать следующее:

// 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();
  • 0
    Да, вы правильно поняли. Но если у меня есть 100 дБ, как «задачи», то я не могу написать 100 таких файлов. Если мы сможем перечислить все базы данных из определенной учетной записи cloudant и подключиться к ней во время инициализации метеорного сервера, даже тогда динамически созданные базы данных не будут перечислены. Возможно, мне придется останавливать сервер и перезапускать каждый раз, когда я добавляю новую БД, или мне нужно следить за Cloudant, который обновляет список БД.
  • 0
    @AnnopGoudar Я добавил код для динамического создания БД. Надеюсь, это поможет.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню