首页 文章

无法从nodejs / mongoose捕获错误

提问于
浏览
1

我试图重新抛出并随后捕获从mongoose findOne 语句返回的错误 .

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

events.js:188 throw err; ^错误:未处理的“错误”事件 . (找不到播放器:NONEXISTENT_PLAYERNAME)位于model.Query的Function.emit(events.js:186:19) . (/Users/blair/Documents/Lobster/node_modules/mongoose/lib/model.js:4083:13)/Users/blair/Documents/Lobster/node_modules/kareem/index.js:273:21 at / Users / blair /Documents/Lobster/node_modules/kareem/index.js:131:16在_combinedTickCallback(internal / process / next_tick.js:131:7)at process._tickDomainCallback(internal / process / next_tick.js:218:9)

我的代码:

Game Route

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

Game Controller

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);
    });
};

Game Model

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 回答

  • 1

    您可以使用 Callbacks 轻松获取 .

    参考:

    Controller

    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)
                    }
                });
            }
        });
    };
    

    Model:

    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);
    }
    

    希望这对你有所帮助 .

相关问题