Невозможно прочитать свойство 'emit' из undefined при попытке выдать документ - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь создать design для тегов сущностей в PouchDB с ReactJS. Мне удалось сохранить мой дизайн с помощью функции 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?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Я предполагаю, что ваша функция является частью класса JavaScript (в противном случае вы должны объяснить идею с помощью this). В ES6 вы должны привязать this к своим обычным функциям. У вас есть два варианта:

Первый - привязать его через конструктор:

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

Второй - объявить функцию как стрелку один. Таким образом, реакция свяжет это для вас:

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);
       });
     }
   }
};
1 голос
/ 21 апреля 2020

Вам не нужно вызывать 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

...