mongoose使用findById时报错path需为字符串却收到model实例怎么解决
问题原因
- 报错和
findById执行无关,问题出在res.render的参数使用错误。 - Express的
res.render()方法第一个入参要求为字符串类型的视图模板路径(对应项目views目录下的模板文件),你直接将Bid.findById返回的Mongoose模型实例作为第一个参数传入,类型不匹配触发类型错误。 - 接口未添加异步异常捕获逻辑,异步抛出的错误未被处理,进而出现UnhandledPromiseRejectionWarning相关警告。
解决方法
根据你的业务需求二选一即可:
场景1:需要渲染模板页面
修正res.render的传参,第一个参数填实际的模板路径,第二个参数传入要注入模板的查询数据,同时添加异常捕获逻辑:
app.get('/:id', async (req,res, next) => { try { const id = req.params.id; const bids = await Bid.findById(id) // 示例:如果模板文件是views/bidDetail.ejs,第一个参数填'bidDetail' res.render('你的实际模板文件名', { bids }) } catch (err) { // 将异常传递给Express错误处理中间件 next(err) } })
场景2:仅需要返回JSON数据
不需要调用res.render,直接使用res.json()返回查询结果即可:
app.get('/:id', async (req,res, next) => { try { const id = req.params.id; const bids = await Bid.findById(id) res.json(bids) } catch (err) { next(err) } })
内容的提问来源于stack exchange,提问作者20CS039 - Gratus Richard A
相关产品推荐
相关产品推荐

