【问题标题】:RxDB - Document update conflict (error 409)RxDB - 文档更新冲突(错误 409)
【发布时间】:2019-04-05 08:45:07
【问题描述】:

我使用 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;
};

这是获取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 时会发生这种情况。 我知道这个问题可能会因为update.then() 之后的原始文档和更新文档中的不同_rev 属性而发生,但是在更新文档中重新定义_rev 的值并没有帮助! 我也为PouchDB找到了这个解决方案:https://github.com/pouchdb/pouchdb/issues/1691#issuecomment-38112213 由于我是 RxDB 的新手,请指出我应该如何处理 RxDB document.update!提前致谢。

更新: 我尝试以这种方式使用 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 来更新上面代码中的方法?

【问题讨论】:

  • 您是否尝试过使用atomicUpdaterxdb.info/rx-document.html#atomicupdate
  • 顺便说一句,findOne 更适合查询单个文档:rxdb.info/rx-query.html#findone
  • 谢谢阿尔夫!我尝试以这种方式使用 atomicUpdate:``` const changedData = oldDoc => { const val = value ? value.toJS() : ''; oldDoc.unsavedData[key] = val;返回旧文档; }; const updatedDoc = yield userDoc.atomicUpdate(changedData).then(doc => doc);产生更新的Doc.save(); ``` 但是数据库中的数据没有更新。也许,我做错了?我应该如何使用 atomicUpdate 来更新上面代码中的方法?
  • 谢谢@AlfEaton!这对我有用: const updateDocument = doc => { const val = value ? value.toJS() : ''; doc.set(unsavedData, { ...doc.unsavedData, [key]: val });返回文件; };请添加您的答案,这样我就可以将其固定为正确的答案:)
  • 太棒了!我添加了atomicUpdate 作为答案。

标签: javascript rxdb


【解决方案1】:

RxDocument 方法atomicUpdate 可能是您所需要的,以避免同时运行多个更新引起的冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多