RxDB - конфликт обновления документа (ошибка 409) - PullRequest
2 голосов
/ 05 апреля 2019

Я использую RxDB и хочу обновить документ в нем.Вот как создается БД:

const _create = async function() {
  const db = await RxDB.create({
    name: 'myName',
    adapter: process.env.NODE_ENV === 'test' ? 'memory' : 'idb',
    password: process.env.DB_PASSWORD,
    multiInstance: true,
    ignoreDuplicate: true,
  });

  if (process.env.NODE_ENV === 'development') {
    window['db'] = db;
  }

  db.waitForLeadership().then(() => {});

  await Promise.all(collections.map(colData => db.collection(colData))).catch(
    e => e,
  );

  return db;
};

Это метод получения БД:

const getDB = () => {
  if (!dbPromise) dbPromise = _create();
  return dbPromise;
};

И это функция генератора для сохранения данных в БД:

export function* saveDataToDb(action) {
  const { key, value } = action;
  try {
    const db = yield getDB();

    const userDoc = yield db['my_collection'].find({ user: 'myUser' })
      .exec()
      .then(docs => docs[0]);

    const operationType = value ? '$set' : '$unset';

    const updatedDoc = yield userDoc
      .update({
        [operationType]: {
          [`unsavedData.${key}`]: value ? value.toJS() : '',
        },
      })
      .then(doc => doc);
    yield updatedDoc.save();
  } catch (error) {
    console.log(error);
  }
}

Проблема в том, что обычно saveDataToDb функция работает довольно хорошо, но после нескольких вызовов она переходит к catch с такой ошибкой:

CustomPouchError: {
  docId: "myUser"
  error: true
  id: "myUser"
  message: "Document update conflict"
  name: "conflict"
  status: 409
}

Это происходит, когда я 'Я пытаюсь yield userDoc.update.Я знаю, что эта проблема может возникнуть из-за различных свойств _rev в исходных и обновленных документах после update.then(), но переопределение значения _rev в обновленном документе не помогает!Я также нашел это решение для PouchDB: https://github.com/pouchdb/pouchdb/issues/1691#issuecomment-38112213 Поскольку я новичок в RxDB, пожалуйста, укажите, что я должен делать в отношении RxDB document.update!Заранее спасибо.

UPD: я пытался использовать atomicUpdate следующим образом:

const changedData = oldDoc => {
  const val = value ? value.toJS() : '';
  oldDoc.unsavedData[key] = val;
  return oldDoc;
};

const updatedDoc = yield userDoc.atomicUpdate(changedData).then(doc => doc);
yield updatedDoc.save();

Но данные не обновляются в базе данных.Возможно, я делаю это неправильно?Как мне использовать atomicUpdate для обновления метода в приведенном выше коде?

1 Ответ

1 голос
/ 05 апреля 2019

Метод RxDocument atomicUpdate, вероятно, вам нужен, чтобы избежать конфликтов, вызванных одновременным выполнением нескольких обновлений.

...