Mongoose停止接受对其某些功能的回调

回答 5 浏览 1.3万 2023-02-27

我使用.save()和.findOne()的回调已经好几天了,就在今天,我遇到了这些错误:

throw new MongooseError('Model.prototype.save() no longer accepts a callback')

MongooseError: Model.prototype.save() no longer accepts a callback

MongooseError: Model.findOne() no longer accepts a callback

考虑到文档中至少对.findOne()的回调仍被接受,这真的很令人尴尬。

app.post("/register", (req, res) => {
    const newUser = new User({
        email: req.body.username,
        password: req.body.password
    });

    newUser.save((err) => {
        if (err) console.log(err)
        else res.render("secrets");
    });
});

这是我以前使用Express和mongoose时的做法。请让我知道如何修复它。

pablofdezr 提问于2023-02-27
看来文档没有更新。这里是不再支持回调的函数列表:mongoosejs.com/docs/…Prerak Sola 2023-02-27
你应该使用 await 和 try/catch 来处理这个问题。另外,当创建一个新的用户时,我建议用User.create()代替。Geri Dremák 2023-02-27
5 个回答
#1楼 已采纳
得票数 7

MongooseError: Model.find() no longer accepts a callback

因为从现在开始,回调函数已经被废弃了。 如果你使用带有回调的这些函数,请使用async/await或者promises,如果async函数对你不适用的话。

app.get("/articles", async (req, res) => {
  try {
    const articles = await Article.find({ });
    res.send(articles);
    console.log(articles);
  } catch (err) {
    console.log(err);
  }
});
Sunny 提问于2023-02-28
phuzi 修改于2023-03-23
#2楼
得票数 3

大家好!Mongoose刚刚做了一个新的更新,Mongoose现在已经摆脱了回调。所以这意味着,现在不用再做这个

//Old way ( doesn't work anymore )

data.save((err, result) => {
   if(!err) console.log(result);
})

你应该像这样做!

//New way ( use this in your projects )

const result = await data.save() // Make sure to wrap this code in an async function
console.log(result);

这也适用于其他每一个mongoose的回调

Nethan Karerakattil 提问于2023-03-01
Nethan Karerakattil 修改于2023-03-01
#3楼
得票数 2
// old way (deprecated)

Model.find(function(err, models){
if (err) {
  console.log(err);
}else {
  console.log(models);
}

});

// new way

Model.find()
.then(function (models) {
console.log(models);
})
.catch(function (err) {
console.log(err);
});
Sheriff 提问于2023-03-19
当我研究和更新我的代码时,这对我很有效。祝您好运!Sheriff 2023-03-19
#4楼
得票数 1
app.post("/register", function(req, res){
    const newUser = new User({
        email: req.body.email,
        password: req.body.password
    });

    newUser.save().then(()=>{
        res.render("secrets");
    }).catch((err)=>{
        console.log(err);
    })
});

希望对你有帮助!

Debanik Biswas 提问于2023-02-28
#5楼
得票数 0
app.post("/login",function(req,res){
    const username = req.body.username;
    const password = req.body.password;

    User.findOne({email:username})
    .then((foundUser) => {
        if(foundUser){
            if(foundUser.password === password){
                res.render("secrets");
            }
        }
   })
   .catch((error) => {
       //When there are errors We handle them here

console.log(err);
       res.send(400, "Bad Request");
   });
      
});

这对我有用,我也在做 angela yu 的web dev bootcamp。

现在看来,你必须使用=>then和=>catch来进行处理。

Gorka Zamorano 提问于2023-02-27
Gorka Zamorano 修改于2023-02-27
这就是我修复错误的原因。我只是不明白它是如何从一天变成另一天的。昨天还完全正常,今天运行时却出现了错误。谢谢你的帮助!pablofdezr 2023-02-27
是的,这是从一天到另一天。Gorka Zamorano 2023-02-28
我也在学习你提到的同样的课程。我刚刚完成了后端部分&;现在正向React进发。由于Angela Yu到处解释回调函数,对我来说,把回调改为async await或promises是很难做到的。总之,很高兴在这里看到你。Sunny 2023-03-19