2017-08-11 3 views
0

Ich versuche, einen generischen Dokument Update-Handler zu erstellen.CouchDB Dokument Update Handler: Javascript

Ich verwende:

function(doc, req) {var field = req.query.field; var value = 
req.query.value; var message = 'set '+field+' to '+value; doc[field] = 
value; return [doc, message]; } 

Dies funktioniert ok mit einfachen json aber nicht mit einem verschachtelten Objekt wie

"abc":{"ax":"one", "by":"two" ...} 

mein curl Befehl lautet:

curl -X PUT 'http://127.0.0.1:5984/db/_design/updatehandler/_update/inplace/id?field=abc.ax&value=three' 

Das Ergebnis ist ein neues Feld erstellt und die vorhandene abc: {ax: one} bleibt unberührt.

Mit einem einfacheren Beispiel:

wenn ich: "xyz":"five"

curl -X PUT 'http://127.0.0.1:5984/db/_design/updatehandler/_update/inplace/id?field=xyz&value=ten' 

... richtig funktioniert.

Ich habe noch nicht den generischen Prozess auf "pqr":[s, t, u] versucht, aber ich denke dies kann eine andere Design-Modifikation erfordern.

Idealerweise will man etwas, das zumindest in den oben genannten drei Fällen funktioniert, solange es nicht zu komplex ist, um es nicht zu belasten. der Aufwand.

Könnte jemand bitte hier helfen oder verweisen Sie mich bitte auf einige Javascript-Beispiele.

Vielen Dank.

John

Antwort

0

function (doc, req) { 
 
    function merge(nDoc,oDoc) { 
 
     for (var f in nDoc) { 
 
      var tmpNewDoc = nDoc[f], 
 
       tmpDoc = oDoc[f]; 
 
      var type = typeof(tmpNewDoc); 
 
      if (type === 'object' && tmpNewDoc.length === undefined && tmpDoc !== undefined) merge(tmpNewDoc, tmpDoc); 
 
      else oDoc[f] = tmpNewDoc; 
 
     } 
 
    } 
 
\t 
 
    if (!doc) { 
 
\t \t return [null, toJSON({ 
 
\t \t \t error: 'not_found', 
 
\t \t \t reason: 'No document were found with the specified ID or an incorrect method was used.' 
 
\t \t })]; 
 
\t } 
 
\t 
 
\t try { 
 
\t \t var newDoc = JSON.parse(req.body); 
 
\t \t merge(newDoc, doc); 
 
\t } 
 
\t 
 
\t catch (e) { 
 
\t \t return [null, ToJSON({ 
 
\t \t \t error: 'bad_request', 
 
\t \t \t reason: 'Invalid json or processing error' 
 
\t \t })]; 
 
\t } 
 
\t 
 
    return [doc, toJSON({ 
 
     doc: doc, 
 
     ok: true 
 
    })]; 
 
}" 
 
    }

einfach das neue Dokument zu diesem Handler übergeben. Es wird die neuen Werte mit ihm zusammenführen (Warnung, die Arrays werden überschrieben). Wenn Sie auch ein Array zusammenführen möchten, können Sie entweder eine Bibliothek eines Drittanbieters verwenden oder eine eigene rekursive Zusammenführungsfunktion erstellen.

+0

Danke @Alexis. In diesem Fall haben Sie vorgeschlagen, wie würde der Befehl curl POST aussehen? – jlb333333

+0

Siehe [diese Dokumentation] (http://docs.couchdb.org/en/2.1.0/api/ddoc/render.html#post--db-_design-ddoc-_update-func) –

+0

Hallo @Alexis. Danke für das. Tut mir leid, dich zu ärgern. Ich bekomme den folgenden Fehler beim Ausführen des Updates: '{" error ":" render_error "," Grund ":" Funktion ausgelöst Fehler: (new TypeError (\ "Object.assign ist keine Funktion \" 'Zeigt dies nichts I Tut mir leid, wieder zu tun. – jlb333333

Verwandte Themen