Node.js Express更新MongoDB时出现Converting circular structure to JSON错误
问题:更新图片数组到MongoDB时出现"Converting circular structure to JSON"错误
错误信息
TypeError: Converting circular structure to JSON --> starting at object with constructor 'MongoClient'
相关代码
const updateCompany = async (req, res) => { const file = req.files; if (!file) return res.status(400).send('No image in the request'); const companyLogoName = file[0].filename; const companyImageName = file[1].filename; const basePath = `${req.protocol}://${req.get('host')}/public/uploads/`; // console.log(`${basePath}${companyLogoName}`); // console.log(`${basePath}${companyImageName}`); try { const updateCompany = Company.findByIdAndUpdate(req.params.id, { companyName: req.body.companyName, companyDescription: req.body.companyDescription, companyWebsite: req.body.companyWebsite, companyDHeadQuater: req.body.companyDHeadQuater, companySpecialities: req.body.companySpecialities, companyFounded: req.body.companyFounded, companyIndustry: req.body.companyIndustry, companyMinEmploye: req.body.companyMinEmploye, companyMaxEmploye: req.body.companyMaxEmploye, companyType: req.body.companyType, companyLogo: `${basePath}${companyLogoName}`, companyImage: `${basePath}${companyImageName}`, }, { new: true }); // console.log(updateCompany); return res.status(200).json({ success: true, data: updateCompany }) } catch (err) { console.log(err); if (err.name === 'ValidationError') { console.error(Object.values(err.errors).map(val => val.message)) return res.status(400).json({ success: false, message: Object.values(err.errors).map(val => val.message)[0] }) } return res.status(400).json({ success: false, message: err }) } };
补充说明
控制台中图片路径显示正确,说明multer等功能正常,但问题出在数据更新环节。
解决方法
错误原因
findByIdAndUpdate是Mongoose的异步方法,你没有使用await关键字,导致updateCompany变量存储的是Mongoose Query对象,而非实际更新后的文档。这个Query对象内部包含MongoClient的引用,存在循环引用结构,当你尝试用res.json()序列化它时,就会触发"Converting circular structure to JSON"错误。
修复代码
只需要在findByIdAndUpdate前添加await关键字,等待异步操作完成后获取实际的文档对象:
const updateCompany = async (req, res) => { const file = req.files; if (!file) return res.status(400).send('No image in the request'); const companyLogoName = file[0].filename; const companyImageName = file[1].filename; const basePath = `${req.protocol}://${req.get('host')}/public/uploads/`; try { // 关键:添加await关键字 const updateCompany = await Company.findByIdAndUpdate(req.params.id, { companyName: req.body.companyName, companyDescription: req.body.companyDescription, companyWebsite: req.body.companyWebsite, companyDHeadQuater: req.body.companyDHeadQuater, companySpecialities: req.body.companySpecialities, companyFounded: req.body.companyFounded, companyIndustry: req.body.companyIndustry, companyMinEmploye: req.body.companyMinEmploye, companyMaxEmploye: req.body.companyMaxEmploye, companyType: req.body.companyType, companyLogo: `${basePath}${companyLogoName}`, companyImage: `${basePath}${companyImageName}`, }, { new: true }); return res.status(200).json({ success: true, data: updateCompany }) } catch (err) { console.log(err); if (err.name === 'ValidationError') { console.error(Object.values(err.errors).map(val => val.message)) return res.status(400).json({ success: false, message: Object.values(err.errors).map(val => val.message)[0] }) } return res.status(400).json({ success: false, message: err.message }) } };
额外优化建议
在catch块中返回错误时,建议使用err.message而非直接返回err对象,避免再次出现循环引用序列化的问题。
内容的提问来源于stack exchange,提问作者rameez khan
相关产品推荐
相关产品推荐

