You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:01:12