为什么我会收到此错误:错误:传入的参数必须是 12 个字节的单个字符串或 24 个十六进制字符的字符串

问题描述 投票:0回答:1

如果在数据库中找不到特定任务 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()

node.js mongodb error-handling constructor callback
1个回答
0
投票

在解析你的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)
        }
})
© www.soinside.com 2019 - 2024. All rights reserved.