如果在数据库中找不到特定任务 ID,我想注销错误。使用我编写的代码,我可以获得具有正确 id 的任务,但是当我使用错误的 id 而不是记录自定义错误时,我会遇到错误,我收到此错误:
Error: messageFormat: undefined,
stringValue: '"65cf79f286f0b32a7022ed9p"',
kind: 'ObjectId',
value: '65cf79f286f0b32a7022ed9p',
path: '_id',
reason: Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
如果我使用错误的 ID,则不会读取“IF”语句,并且我的代码会崩溃。 这是我的代码:
const getTask = asyncWrapper(async(req, res, next) =>{
const {id:taskID} = req.params
const task = await Task.findOne({_id: taskID})
if(!task){
console.log("Hit!")
const error = new Error('Not Found')
error.status = 404
return next(error)
}
res.status(200).json({task})
})
这是我的错误处理程序:
const errorHandlerMiddleware =(err, req, res, next)=>{
console.log(err)
return res.status(500).json({msg: "something went wrong, try again"})
}
module.exports = errorHandlerMiddleware
这是我的应用程序文件:
//middleware
app.use(express.static("./public"))
app.use(express.json())
//routes
// app.get("/hello", (req, res)=>{
// res.send("Task Manager App")
// })
app.use("/api/v1/tasks", tasks)
app.use(notFound)
app.use(errorHandlerMiddleware)
const port = 3000
const start = async() =>{
try {
await connectDB(process.env.MONGO_URI)
app.listen(port, console.log(`app is listening on server ${port}...`))
} catch (error) {
console.log(error)
}
}
start()
在解析你的taskId时使用简单的try catch。
在您的示例中,您会收到错误,因为提供的字符串不是十六进制值(如注释中的 VLAZ 所述)。
const getTask = asyncWrapper(async(req, res, next) =>{
try {
const {id:taskID} = req.params
const task = await Task.findOne({_id: taskID})
if(!task){
console.log("Hit!")
const error = new Error('Not Found')
error.status = 404
return next(error)
}
res.status(200).json({task})
} catch (parseError) {
const error = new Error('Error while parsing taskId in ObjectId')
error.status = 404
return next(error)
}
})