尝试发出文档时无法读取未定义的 属性 'emit'

Cannot read property 'emit' of undefined when trying to emit a document

我正在尝试为 PouchDB 中带有 ReactJS 的实体标签创建 design。我设法使用 put 函数保存了我的设计,但是当我查询我的设计时,响应只是一个空数组,我在控制台中收到以下错误:

TypeError: Cannot read property 'emit' of undefined

我认为问题出在我后来用作我的设计变量的映射参数的函数中:

function emitTagsMap(doc)
{
  if (doc !== undefined)
  {
    if (Array.isArray(doc.tags))
    {
       doc.tags.forEach(x =>
       {
          /* Here is probably the problem - this.db is undefined */
          this.db.emit(x, null);
       });
     }
   }
};

this.db 在构造函数中声明:

constructor(service, name)
{
        if (!service || !name) throw new Error("PouchDatabase initialized incorrectly");
        this.name = name;
        this.db = new PouchDB(name);
        this.service = service;
        this.tagsView();
}

请记住,我是 PouchDB 的新手。

关于如何初始化 emit 函数的任何想法?

提前谢谢你。

我假设你的函数是 JavaScript class 的一部分(否则你必须用 this 来解释这个想法)。在 ES6 中,你必须将 this 绑定到你的常规函数​​。您有两个选择:

首先 - 通过构造函数绑定它:

constructor() {
  this.emitTagsMap = this.emitTagsMap.bind(this);
}

其次 - 将函数声明为箭头函数。这样,react 会为你绑定它:

emitTagsMap = (doc) =>
{
  if (doc !== undefined)
  {
    if (Array.isArray(doc.tags))
    {
       doc.tags.forEach(x =>
       {
          /* Here is probably the problem - this.db is undefined */
          this.db.emit(x, null);
       });
     }
   }
};

您不需要通过数据库对象调用 emit。

试试这个:

function emitTagsMap(doc)
{
  if (doc !== undefined)
  {
    if (Array.isArray(doc.tags))
    {
       doc.tags.forEach(x =>
       {
          emit(x, null);
       });
     }
   }
};

根据 PouchDB 文档,设计文档是这样形成的:

// first create a new design doc and pass your map function as string into it
var ddoc = {
      _id: "_design/my_index",
      views: {
        by_name: {
         map: "function (doc) {         if (doc !== undefined) {          if (Array.isArray(doc.tags)) {            doc.tags.forEach(x => {              emit(x, null);            });          }        }      }"
        }
      }
    };

// save it
db.put(ddoc).then(function () {
  // success!
}).catch(function (err) {
  // some error (maybe a 409, because it already exists?)
});

//Then you actually query it, by using the name you gave the design document when you saved it:

db.query('my_index/by_name').then(function (res) {
  // got the query results
}).catch(function (err) {
  // some error
});

https://pouchdb.com/guides/queries.html