RxDB - 文档更新冲突(错误 409)
RxDB - Document update conflict (error 409)
我用的是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
的时候。
我知道这个问题可能是因为 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?
RxDocument 方法atomicUpdate
可能是您所需要的,以避免多个更新运行 同时引起的冲突。
我用的是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
的时候。
我知道这个问题可能是因为 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?
RxDocument 方法atomicUpdate
可能是您所需要的,以避免多个更新运行 同时引起的冲突。