CouchDB 更新处理程序:doc update/insert 使用 Nano

CouchDB Update Handler: doc update/insert using Nano

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

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

我在 Node JS 应用程序中使用 Nano 作为客户端,我需要使用更新处理程序插入(如果不存在)/如果存在(如果存在)文档。为此,我在 couchDB 中创建了以下文档;

  "_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"
}

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

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

它总是 returns 'OK' 即使我传递了无效数据。 对于真实数据,它 returns OK 但它不会更新文档。 需要弄清楚如何以正确的方式实现这一点(如果文档存在则更新,如果它是新文档则插入)。

当前代码的行为

您的自定义字段名称如 locale 对于 docreq 都是 undefined,因为:

  1. doc.customfield, atomic("handler", "handler", "_design/handler" 调用设计文档本身的设计(3rd parameter to atomic要更新的文档) 并且您的设计文档自然缺少您放置在示例语言环境文档中的自定义字段。

  2. req.customfield,这些都是不存在的req字段,atomic传入的字段在JSON在 req.body 中,如原子文档所示。

如果 undefined === undefined 为真,那么您对这些字段的检查总是通过。

然后:

  1. 您更新设计文档而不修改文档:
{ return [doc, 'OK'];}

所以couchdb保存不变的design doc(问题1),导致只有它的_rev一直往上:

{ "_id": "_design/handler", "_rev": "36-...

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

解决这3个问题

  1. 在正确的文档上调用它:

    translationsDB.atomic("handler", "handler", "a62f81b5afad1857c2f6399db500c73b",

  2. 从 req.body 中提取自定义字段:

       var reqb = JSON.parse(req.body); 
       if (doc.type === reqb.type && doc.origin_id === reqb.origin_id && doc.locale === reqb.locale)
    
  3. 对返回的文档进行一些修改:

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