Node.js Mongoose错误:TypeError:无法读取属性';执行官';未定义的
我正在尝试设置(这是我第一次尝试)一个函数,它接收输入,通过一个函数传递输入,然后通过后续操作传递结果 我得到以下错误Node.js Mongoose错误:TypeError:无法读取属性';执行官';未定义的,node.js,mongodb,mongoose,es6-promise,Node.js,Mongodb,Mongoose,Es6 Promise,我正在尝试设置(这是我第一次尝试)一个函数,它接收输入,通过一个函数传递输入,然后通过后续操作传递结果 我得到以下错误 TypeError: Cannot read property 'exec' of undefined 我以前从未使用过承诺,我相信这就是我在这个例子中应该做的,我认为我不太理解如何使用.exec和.then部分来构造东西 app.get('/api/gameobjects/:userid/:golng/:golat/:dist', (req, res) => {
TypeError: Cannot read property 'exec' of undefined
我以前从未使用过承诺,我相信这就是我在这个例子中应该做的,我认为我不太理解如何使用.exec和.then部分来构造东西
app.get('/api/gameobjects/:userid/:golng/:golat/:dist', (req, res) =>
{
console.log("First part");
GameObject.getNearGameObjects(req.params.golng, req.params.golat, req.params.dist)
.exec((err, gameobject) =>
{
if (err)
{
res.json(err);
}
})
.then((gameobject) =>
{
console.log("Third part");
User.addGameObjectToUser(req.params.userid, gameobject)
})
});
编辑:
getNearGameObjects的代码:
// Get Near Game Objects
module.exports.getNearGameObjects = function( long, lat, dist, callback, limit )
{
var coords = [];
coords[ 0 ] = long;
coords[ 1 ] = lat;
var query =
{ geometry: { $near: { "$geometry": { "type": "Point", "coordinates": [long, lat] }, $maxDistance: dist } } };
GameObject.find( query, callback ).limit( limit );
};
addGameObjectToUser的代码
// Add object to user
module.exports.addGameObjectToUser = function(id, gameobject, callback)
{
var query = { _id: id };
User.findByIdAndUpdate( query, { "$addToSet" : { "inventory" : gameobject } } );
};
我决定回到我知道的代码,并根据结果调用嵌套,这意味着更多的代码,但更重要的是它可以工作 我仍然对理解如何在API中实现基于承诺的代码非常感兴趣,因为它看起来确实是一种更整洁的格式 以下是工作代码:
app.get('/api/gameobjects/:userid/:golng/:golat/:dist', function (req, res)
{
console.log("starting");
GameObject.getNearGameObject(req.params.golng, req.params.golat, req.params.dist, function (err, gameobject)
{
if (err)
{
res.json(err);
}
console.log("got a game object");
User.addGameObjectToUser(req.params.userid, gameobject, function (err, user)
{
if (err)
{
res.json(err);
}
console.log("updated a user");
GameObject.removeGameObjectByLocation(req.params.golng, req.params.golat, function(err, gameobject)
{
if (err)
{
res.json(err);
}
console.log("removed a game object");
res.json(gameobject);
});
});
});
});
如果没有从函数返回任何内容,默认情况下,它将返回
undefined
你越来越
TypeError:无法读取未定义的属性“exec”
因为将对返回的未定义的调用.exec()
如果要在find()
上调用.exec()
,则应删除其上的回调参数。使其返回promise
做出这些改变
module.exports.getNearGameObjects = function (long, lat, dist, callback, limit) {
return GameObject.find({
geometry: {
$near: {
"$geometry": {
"type": "Point",
"coordinates": [long, lat]
},
$maxDistance: dist
}
}
}).limit(limit);
};
类似地,.catch()
将在错误发生时处理错误
GameObject.getNearGameObjects(req.params.golng, req.params.golat, req.params.dist)
.exec().then((gameobject) => {
console.log('Third part');
return User.addGameObjectToUser(req.params.userid, gameobject);
}).catch((err) => {
res.json(err);
});
你能发布getNearGameObjects()
body吗?将代码添加到原始帖子中。此后,我在一篇关于Mongoose promise代码的教程中尝试重写代码,但仍然会遇到相同或类似的错误。我看到的所有示例都没有使用相同的API调用设置来创建这些示例,因此我必须对要做的事情做出一些假设。