我正尝试重新抛出并随后捕获从猫鼬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;
});
});
};
我想在控制器中返回正确的错误详细信息。
答案 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);
}
希望这对您有所帮助。