Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose错误:TypeError:无法读取属性';执行官';未定义的_Node.js_Mongodb_Mongoose_Es6 Promise - Fatal编程技术网

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调用设置来创建这些示例,因此我必须对要做的事情做出一些假设。