我将以下格式的一些基于语言环境的数据存储在CouchDB中。

{
  "_id": "a62f81b5afad1857c2f6399db500c73b",
  "_rev": "3-923e5ed468e0f617f09057035b41051a",
  "type": "CAT",
  "origin_id": "1",
  "locale": "ar",
  "values_translation": {
    "id": "ar",
    "title": ""
  }
}


我使用Nano作为Node JS应用程序中的客户端,如果不存在,则需要插入/更新,如果存在,则需要使用Update Handler进行更新。为此,我在ouchDB中创建了以下文档;

  "_id": "_design/handler",
  "_rev": "36-d2d08a0a822a762ac07faa4042eca5a0",
  "updates": {
    "handler": "function(doc, req){
       if (doc.type === req.type && doc.origin_id === req.origin_id && doc.locale === req.locale)
       { return [doc, 'OK'];}
       else { return [null, 'KO']; }
    }"
  },
  "language": "javascript"
}


但是当我使用以下Nano方法运行它时,

translationsDB.atomic("handler", "handler", "_design/handler",
      { type, origin_id, locale, values_translation: value }).then((response) => {
        console.log(response);
      }).catch(err => {
        console.log(err);
      });


即使传递无效数据,它也始终返回'OK'
对于真实数据,它返回OK,但不会更新文档。
需要弄清楚如何以正确的方式实现此目标(如果该文档存在,则进行更新;如果它是新文档,则进行插入)。

最佳答案

当前代码的行为

由于localeundefined的自定义字段名称(例如doc均为req),因为:


doc.customfield,atomic("handler", "handler", "_design/handler"在设计文档本身上调用设计(3rd parameter to atomic是要更新的文档),并且您的设计文档自然缺少放在示例语言环境文档中的自定义字段。
req.customfield,这是不存在的req字段,原子传递的字段在req.body中的JSON中,如原子文档中所示。


因此,只要undefined === undefined为true,您的检查始终会通过这些字段。

然后:


您无需修改​​文档即可更新设计文档:



{ return [doc, 'OK'];}



因此,ouchdb保存了未更改的设计文档(问题1),仅导致其_rev不断增加:


  {“ _id”:“ _ design / handler”,“ _ rev”:“ 36 -...


但这是错误的文档,并且没有任何字段被更改。

解决这3个问题


在正确的文档上调用它:

translationsDB.atomic("handler", "handler", "a62f81b5afad1857c2f6399db500c73b",
从req.body中提取customfields:

   var reqb = JSON.parse(req.body);
   if (doc.type === reqb.type && doc.origin_id === reqb.origin_id && doc.locale === reqb.locale)

对返回的文档进行一些修改:

  { return [Object.assign({}, doc, reqb), 'OK'];}

关于javascript - CouchDB更新处理程序:使用Nano进行doc更新/插入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57477157/

10-16 23:11