尝试发出文档时无法读取未定义的 属性 '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
});
我正在尝试为 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
});