【问题标题】:Multer image uploading fails throwing TypeError: Converting circular structure to JSONMulter 图像上传失败抛出 TypeError: Converting circular structure to JSON
【发布时间】:2020-05-14 05:53:35
【问题描述】:

我正在使用 mern stack 制作一个涉及多个图像上传的简单应用程序。 我正在使用 multer 进行多张图片上传。尽管 multer 成功上传了图片,但它仍然会抛出一个名为

的异常

TypeError: Converting circular structure to JSON

完全异常看起来像这样:

UnhandledPromiseRejectionWarning: TypeError: Converting circular structure to JSON
[0]     --> starting at object with constructor 'Socket'
[0]     |     property 'parser' -> object with constructor 'HTTPParser'
[0]     --- property 'socket' closes the circle
[0]     at JSON.stringify (<anonymous>)
[0]     at stringify (/home/user/workspace/nodeprojects/tekvertex-mangocoders/node_modules/express/lib/response.js:1123:12)
[0]     at ServerResponse.json (/home/user/workspace/nodeprojects/tekvertex-mangocoders/node_modules/express/lib/response.js:260:14)
[0]     at ServerResponse.send (/home/user/workspace/nodeprojects/tekvertex-mangocoders/node_modules/express/lib/response.js:158:21)
[0]     at /home/user/workspace/nodeprojects/tekvertex-mangocoders/controllers/projects.js:111:13
[0]     at Object.model.saveCategoryStep3 (/home/user/workspace/nodeprojects/tekvertex-mangocoders/models/projects.js:338:5)
[0]     at controller.saveCategoryStep3 (/home/user/workspace/nodeprojects/tekvertex-mangocoders/controllers/projects.js:110:11)
[0]     at Layer.handle [as handle_request] (/home/user/workspace/nodeprojects/tekvertex-mangocoders/node_modules/express/lib/router/layer.js:95:5)
[0]     at next (/home/user/workspace/nodeprojects/tekvertex-mangocoders/node_modules/express/lib/router/route.js:137:13)
[0]     at Immediate.<anonymous> (/home/user/workspace/nodeprojects/tekvertex-mangocoders/node_modules/multer/lib/make-middleware.js:53:37)
[0]     at processImmediate (internal/timers.js:458:21)
[0] (node:31810) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)

我的 express 和 multer 代码如下所示:

    let multer = require('multer');
const { v4: uuidv4 } = require('uuid');

const DIR = './public/images/check';

const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        console.log(req);
        cb(null, DIR);
    },
    filename: (req, file, cb) => {
        const fileName = file.originalname.toLowerCase().split(' ').join('-');
        cb(null, uuidv4() + '-' + fileName)
    }
});

var upload = multer({
    storage: storage,
    fileFilter: (req, file, cb) => {
        if (file.mimetype == "image/png" || file.mimetype == "image/jpg" || file.mimetype == "image/jpeg") {
            cb(null, true);
        } else {
            cb(null, false);
            return cb(new Error('Only .png, .jpg and .jpeg format allowed!'));
        }
    }
});

我的路线是这样的

router.post('/create/step3', [passport.authenticate('jwt', { session: false }), upload.array('imgCollection', 2)], projectsController.mymethod);

这就是我在表单数据中添加的方式。

let formdata = new FormData();
            for (const file of this.state.fields.avatar) {
                console.log(file);
                formdata.append('imgCollection', file, file.name);
            }

在服务器上我发现要接收的文件是这样的:

文件:[ { fieldname: 'imgCollection' }, { fieldname: 'imgCollection' } ]

【问题讨论】:

    标签: node.js reactjs express multipartform-data multer


    【解决方案1】:

    不知怎的,我得到了它,我不知道为什么它现在可以工作了。

    所以不要像下面这样在路由中使用上传作为中间件:

    router.post('/create/step3', [passport.authenticate('jwt', { session: false }), upload.array('imgCollection', 2)], projectsController.mymethod);
    

    我在控制器中使用了它 我的路线现在看起来像这样

        router.post('/create/step3', passport.authenticate('jwt', { session: false })
    , projectsController.mymethod);
    

    所以在我的控制器内部,即 mymethod 中的 projectsController

     const getupload = upload.array('imgCollection', 7);
        getupload(req, res, (err) => {
            if (err) {
                return res.send({
                    status: process.env.CLIENT_ERROR_CODE,
                    message: validation.errors.errors
                });
            }
              //do db stuff
          });
    

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2018-08-31
      • 2018-11-19
      • 2023-01-18
      • 2019-04-03
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多