【问题标题】:Mongoose not saving a model with await and try/catch blockMongoose 不使用 await 和 try/catch 块保存模型
【发布时间】:2020-09-26 01:43:23
【问题描述】:

我创建了一个具有正确属性的游戏模型,并尝试在 try/catch 块中使用 await 保存它,但它没有保存也没有捕获错误。

socket.on('create-game',async (nickName)=>{
        try{
            const quotableData = await QuotableAPI();
            let game = new Game();
            game.words = quotableData;
            let player = {
                socketID : socket.id,
                isPartyLeader : true,
                nickName
            }
            game.players.push(player);
            game = await game.save();
            const gameID = game._id.toString();
            socket.join(gameID);
            io.to(gameID).emit('updateGame',game);
        } catch (err) {
            console.log(err);     
        }
    });

如果我拿走 await,它会起作用(上面的代码),但是稍后在我的代码中(如下所示),当我尝试使用Game.findbyId() 方法,我找不到。

socket.on('join-game',async ({gameID : _id,nickName})=>{
    try{
        let game = await Game.findById(_id);
        if(game.isOpen){
            const gameID = game._id.toString();
            socket.join(gameID);
            let player = {
                socketID : socket.id,
                nickName
            }
            game.players.push(player);
            game = await game.save();
            io.to(gameID).emit('updateGame',game);
        }
    }catch(err){
        console.log(err);
    }
});

编辑:我正在关注一个教程,他们没有编写自己的 save() 函数,所以我认为它在创建模型时已经实现。

const mongoose = require('mongoose');

const PlayerSchema = new mongoose.Schema({
    currentWordIndex : {
        type: Number,
        default : 0
    },
    socketID : {type : String},
    isPartyLeader : {type : Boolean,default : false},
    WPM : {type : Number, default: -1},
    nickName : {type : String}
});

const GameSchema = new mongoose.Schema({
    words : [{type : String}],
    isOpen : {type : Boolean,default : true},
    isOver : {type : Boolean,default : false},
    players : [PlayerSchema],
    startTime : {type : Number}
});

module.exports = mongoose.model('Game',GameSchema);

编辑 2:安装 MongoDB 解决了所有问题。我很伤心,我花了 ~ 一天的时间来调试它。

【问题讨论】:

  • 查看 Game 类定义(这是你写的吗?)至少 save 方法可能很有用
  • 对于猫鼬,当你创建一个模式时你应该创建自己的保存方法吗?
  • 不知道,所以你的游戏类扩展了一些猫鼬类?抱歉,我现在看到了修改
  • 从我的解释来看,猫鼬是一个库,它允许您创建模型,您可以在其中创建模型实例并将它们添加/查询/删除/到您的数据库中。

标签: javascript mongodb mongoose socket.io


【解决方案1】:

findbyid 方法仅适用于保存文档时由 MongoDB 自动创建的 objectId。如果您使用自定义 creteria,则必须使用 find 方法。

【讨论】:

  • 当我安装了 MongoDB 后,一切都开始工作了。在我正在观看的教程中,该人没有安装 MongoDB,所以我想知道如果您使用的是 mongoose,是否需要安装。
  • 可能是该人已经安装了 mongodb,或者该人正在使用远程实例,例如 mongodb atals。 Mongoose 是一个帮助你连接数据库的库,它不是数据库本身。
  • 你能把我们也链接到教程吗?
  • 是的,他们根本没有提及 MongoDB。这是链接:youtube.com/watch?v=YHmrPd5ZIuo
  • 如视频 7:04 所示。该人正在连接到 mongodb 的“本地”实例。连接 url 是 'mongodb://localhost:27017/typeracertutorial'。这里的 localhost 表示这个人已经在本地安装了 mongodb。如果这个人没有提到如何安装 mongodb,你可以在 youtube 上找到很多关于它的教程。例如这里的这个:youtube.com/… for mac 和这个这里的 windows youtube.com/watch?v=pWbMrx5rVBE&ab_channel=TraversyMedia
猜你喜欢
  • 2021-08-28
  • 2018-06-21
  • 2021-11-16
  • 2012-12-22
  • 2019-12-04
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多