2017-05-19 11 views
0

を更新しながら、私はPouchDBデータベースのputメソッドを使用して、いくつかのドキュメントを更新したいと思いますが、それは常にエラー時には404または409で失敗...イオン2とPouchDB:エラー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が表示され続けます。

答えて

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エラーはあなたが取得しようとしている文書は(もはや)存在していないことを示しています。取得しようとしているドキュメントを削除していないことを確認し、ドキュメントを作成する前にドキュメントを取得しようとしていないことを確認してください...

+0

Thx ...この方法で試してみましょう...他の人には... Ionic 2とcordova-sqliteでは、コンストラクタ 'location'に追加する必要があります: 'default': –

0

わかりました。

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

を追加するように注意してください::所在地:それは

まず

、PouchDBのこのようコンストラクタを交換...助け「デフォルト」ではない場合に、データベースがデバイス上に作成されていません。

2番目の問題では、特定のメソッドでPouchDBコンストラクタが呼び出されたため、ドキュメントを更新したいときに_dbプロパティが設定されていませんでした。サービスをリファクタリングしてサービスコンストラクタでPouchDB instanciantionを移動してください。 。初期の答えとして最後に

JL

0

PouchDB upsertは、より便利な方法を提供し、すべてのドキュメントを更新するために...そして、())

Thxを4に.getを(適用:

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

    /* return doc after all modifications are done: */ 
    return doc; 
}) 
関連する問題