使用Mongoose和express.js从mongoDB中获取单个项目,并返回自定义页面

g0czyy6m  于 2024-01-08  发布在  Go
关注(0)|答案(2)|浏览(155)

我试图使用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函数,我认为(不确定)它抛出,这就是为什么应用程序崩溃。我把整个东西放在trycatch中,同样的问题发生了。

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

bxgwgixi

bxgwgixi1#

mongoose Model.findById()方法是一个异步任务。这意味着在使用它的返回值之前,您需要等待它完成。
我是新来的表达和JS一般
对于JavaScript的初学者来说,处理异步代码可能会让人感到困惑。通常有两种方法。要么使用回调,要么使用Promises
Mongoose曾经支持回调,但现在已经转移到了promise。这意味着你需要使用then().catch()块或try/catch块的首选async/await模式。
在你的回答中,你已经正确地确定了一个使用then().catch()块的解决方案,但是使用嵌套的then()块可能会导致可读性和可维护性问题,类似于使用回调时遇到的问题。
下面是一个使用async/await的例子:

app.get("/item/:id", async (req, res) => { //< Marks the callback as async
   try{
      const item = await Item.findById(req.params.id); //< Use of await keyword
      if(!item){ //< item will be null if no matches in database
         return res.status(400).json({ //< Early return if no match
            message: 'No Item found'
         })
      }     
      return res.status(200).json({
         item: item
      });
   } catch(err){
      console.log(err); //< Log the actual error so you can check
      return res.status(500).json({
         message: 'Error on server'
      });
      //or whatever response you want to send
   }
});

字符串
你会发现mongoose中所有的数据库查询都是异步的,所以你需要记住这一点。

bvuwiixz

bvuwiixz2#

我的直觉是正确的findById()抛出一个错误,并崩溃的应用程序时,对象不存在,我只是不熟悉处理错误的JS.无论如何,这里是正确的代码,如果有人需要它在未来

app.get("/item/:id",(req,res)=>{
   Item.findById(req.params.id).then((item)=>{
        res.json(item)
    }).catch(err =>{
        if(err){
            res.sendFile(__dirname+"/404.html")
            //or whatever response you want to send
        }
    })
})

字符串

相关问题