Ionic 2和PouchDB:更新文档时出现错误404或409

时间:2017-05-19 11:53:26

标签: ionic2 pouchdb

我想使用PouchDB数据库的put方法更新一些文档,但它总是失败,错误有时是404或409 ...

我的文档是:

{
    "_id": "1",
    "id": 1,
    "type": "area",
    "translations": {
      "fr": "Frigo",
      "en": "Fridge"
    },
    "stats": {
      "totalProducts": 0,
      "totalQuantity": 0,
      "stockPrice": 0.00
    },
    "logo": "frigo.png"
}

更新过程:

this._db.get('1', {include_docs: true}).then((doc) => {
    console.log('Original area : ' + JSON.stringify(doc));
    let updateDoc: any = {};
    updateDoc._id = doc._id;
    updateDoc._rev = doc._rev;
    updateDoc.stats.totalProducts = doc.stats.totalProducts++;
    updateDoc.stats.totalQuantity = doc.stats.totalQuantity + product.stock[0].initialQuantity;
    updateDoc.stats.stockPrice = doc.stats.stockPrice + product.stock[0].totalPrice;
    this._db.put(updateDoc).then((response) => {
      console.log('Update success');
    });
  }).catch(function(err){
    console.log('Exception raised : ' + err);
})

我做错了什么?我注意设置_id和_rev,但我不断收到错误代码404或409。

3 个答案:

答案 0 :(得分:0)

查看understanding revisions上的文档,尤其是updating documents correctly上的文档。

您无法再次使用相同的_id_rev添加其他文档,这将导致409冲突错误(另请参阅the docs on put)。您必须改为更改原始对象:

this._db.get('1', {include_docs: true}).then((doc) => {
    console.log('Original area : ' + JSON.stringify(doc));

    doc.stats.totalProducts = doc.stats.totalProducts++;
    doc.stats.totalQuantity = doc.stats.totalQuantity + product.stock[0].initialQuantity;
    doc.stats.stockPrice = doc.stats.stockPrice + product.stock[0].totalPrice;
    this._db.put(doc).then((response) => {
       console.log('Update success');
    });
})

404错误表示您尝试获取的文档不再存在(不再)。确保您没有删除您尝试获取的文档,并确保在创建文档之前没有尝试获取该文档...

答案 1 :(得分:0)

好吧,我的代码有些麻烦,如果有帮助......

首先,用这种方式替换PouchDB的构造函数:

  PouchDB.plugin(cordovaSqlitePlugin);
  this._db = new PouchDB('easystock.db', { adapter: 'cordova-sqlite', location: 'default' });

注意添加:location:'default'如果没有,则不在设备上创建数据库。

第二个问题,我的PouchDB构造函数是在一个特定的方法中调用的,所以当我想更新我的文档时,没有设置_db属性,然后...重构我的服务并在服务构造函数中移动PouchDB实例。

最后,应用.get()。then()作为早期回答......

Thx 4 all

JL

答案 2 :(得分:0)

PouchDB upsert提供了一种更方便的方式来更新文档:

db.upsert('docID',function(doc){
    /* Modify "doc" as you wish */
    doc.whatever='new whatever'

    /* return doc after all modifications are done: */
    return doc;
})