无法从nodejs /猫鼬捕获错误

时间:2018-07-14 13:40:46

标签: javascript node.js mongodb mongoose try-catch

我正尝试重新抛出并随后捕获从猫鼬findOne语句返回的错误。

当我的播放器不存在时,我会遇到以下错误:

  

events.js:188         犯错         ^

     

错误:未处理的“错误”事件。 (找不到玩家:NONEXISTENT_PLAYERNAME)       在Function.emit(events.js:186:19)       在model.Query。 (/用户/布莱尔/文档/龙虾/ node_modules /猫鼬/lib/model.js:4083:13)       在/Users/blair/Documents/Lobster/node_modules/kareem/index.js:273:21       在/Users/blair/Documents/Lobster/node_modules/kareem/index.js:131:16       在_combinedTickCallback(内部/进程/next_tick.js:131:7)       在process._tickDomainCallback(internal / process / next_tick.js:218:9)

我的代码:

游戏路线

router.post('/update_player', (req, res) => {
    gameController.updatePlayer(req, res);
});

游戏控制器

controller.updatePlayer = async (req, res) => {
    const { game_name, player_name, x, y, z } = req.body;
    Game.updatePlayer(game_name,player_name,x,y,z).then(updatedGame => {
        res.status(200).json(updatedGame);
    }).catch(err => {
        res.status(500).send(err);
    });
};

游戏模型

GamesModel.updatePlayer = (gameName, playerName, x, y, z) => {
    return PlayersModel.findOne({name: playerName}, (err,player) => {
        if (!player) throw `player not found: ${playerName}`;
        if (err) throw err;
        return GamesModel.findOneAndUpdate({ name: gameName, 'players._id': player._id }, 
        { $set: { 'players.$' : { _id: player._id, x, y, z } } },
        {  
            projection: { players: { '$elemMatch': { _id: player._id} } },
            returnNewDocument: true
        },
        (err, game) => {
            if (err) throw err;
            return game;
        });
    });
};

我想在控制器中返回正确的错误详细信息。

1 个答案:

答案 0 :(得分:1)

您可以使用回调轻松获得它。

参考:

控制器

controller.updatePlayer = async (req, res) => {
    const { game_name, player_name, x, y, z } = req.body;
    Game.getPlayerDetails(playerName, function(err, playerData) {
        if (err) {
            res.status(500).send(err);
        } else {
            Game.updateGame(game_name, playerData, function (err, updatedData) {
                if (err) {
                        res.status(500).send(err);
                } else {
                    res.status(200).send(updatedData)
                }
            });
        }
    });
};

型号:

GamesModel.getPlayerDetails = (playerName, callback) => {
    PlayersModel.findOne({name: playerName}, callback);
} 

 // You can put below code in respective models and import them in controller and use.

GamesModel.updateGame = (gameName, player) => {
    GamesModel.findOneAndUpdate({ name: gameName, 'players._id': player._id }, 
    { $set: { 'players.$' : { _id: player._id, x, y, z } } },
    {  
        projection: { players: { '$elemMatch': { _id: player._id} } },
        returnNewDocument: true
    }, callback);
}

希望这对您有所帮助。

相关问题