我试图使用Express从mongodb数据库获取对象。当它存在时,我可以获取对象,但是当它不存在时,我想发送文本/自定义页面或实际上做任何事情,但应用程序一直崩溃。
我尝试了几个代码,他们都没有重定向我,但只是崩溃,并发送给我一个随机页面说<the path> 404 This page could not be found. Page Developed by @yandeu
。
app.get("/item/:id",(req,res)=>{
Item.findById(req.params.id).then((item)=>{
if(item){
res.json(item)
}else{
res.sendStatus(404)
// and also these lines
//item = {"Status":"not Found"}
// res.json(item)
//and also this line
//res.send("404 page")
//res.sendFile(__dirname+"/404.html")
}
}).catch(err =>{
if(err){
throw err
}
})
})
字符串
在那之后,我删除了所有内容并保留了findById
函数,我认为(不确定)它抛出,这就是为什么应用程序崩溃。我把整个东西放在try
和catch
中,同样的问题发生了。
app.get("/item/:id",(req,res)=>{
try{
Item.findById(req.params.id).then((item)=>{
res.json(item)
})
}
catch(err){
if(err){
throw err
}
console.log("not found")
}
})
型
2条答案
按热度按时间bxgwgixi1#
mongoose
Model.findById()
方法是一个异步任务。这意味着在使用它的返回值之前,您需要等待它完成。我是新来的表达和JS一般
对于JavaScript的初学者来说,处理异步代码可能会让人感到困惑。通常有两种方法。要么使用回调,要么使用Promises。
Mongoose曾经支持回调,但现在已经转移到了promise。这意味着你需要使用
then().catch()
块或try/catch
块的首选async/await
模式。在你的回答中,你已经正确地确定了一个使用
then().catch()
块的解决方案,但是使用嵌套的then()
块可能会导致可读性和可维护性问题,类似于使用回调时遇到的问题。下面是一个使用
async/await
的例子:字符串
你会发现mongoose中所有的数据库查询都是异步的,所以你需要记住这一点。
bvuwiixz2#
我的直觉是正确的findById()抛出一个错误,并崩溃的应用程序时,对象不存在,我只是不熟悉处理错误的JS.无论如何,这里是正确的代码,如果有人需要它在未来
字符串