【问题标题】:Getting error "Cant set headers after they are sent" when trying to upload image and user data to mongoDB尝试将图像和用户数据上传到 mongoDB 时出现错误“发送后无法设置标头”
【发布时间】:2015-09-21 10:04:07
【问题描述】:

我正在使用 Node、Express、Mongo 和 Angular 来制作简单的应用程序。我有一个表单,用户可以在其中插入数据并上传图像。对于图片上传,我使用ng-file-upload。我正在使用multiparty 来获取表单数据。这是我的 API,用于将图像上传到服务器文件夹,并将用户数据连同文件名一起保存和输入到 mongdb 中。

router.route('/upload/image')
    .post(function(req, res){
    var form = new multiparty.Form();
    form.parse(req, function(err, fields, files) {
        console.log(files);
        console.log(fields);
        var file = files.file[0];
        var contentType = file.headers['content-type'];
        var tmpPath = file.path;
        var extIndex = tmpPath.lastIndexOf('.');
        var extension = (extIndex < 0) ? '' : tmpPath.substr(extIndex);
        // uuid is for generating unique filenames.
        var fileName = uuid.v4() + extension;
        var destPath = './public/img/' + fileName;

        // Server side file type checker.
        if (contentType !== 'image/png' && contentType !== 'image/jpeg' && contentType !== 'image/jpg') {
            fs.unlink(tmpPath);
            return res.status(400).send('Unsupported file type.');
        }

        fs.rename(tmpPath, destPath, function(err) {
            if (err) {
                return res.status(400).send('Image is not saved:');
            }
            return res.json(destPath);
        });

        var user = new User();
        user.firstName = fields.firstName;
        user.lastName = fields.lastName;
        user.email = fields.email;
        user.numOfCups = fields.numOfCups;
        user.currentBalance = fields.currentBalance;
        user.totalNumOfCups = fields.numOfCups;
        user.totalMoneySpent = fields.currentBalance;
        user.photo = destPath;

        user.save(function(err, user){
            if(err){
                return res.send(500, err);
            }
            return res.json(user);
        });
    });
});

当我在 UI 中保存用户数据时,它会将文件复制到服务器文件夹中,但不会将数据保存到 mongodb 并引发错误 - “发送后无法设置标题”。我知道这与res.json 被调用两次有关,但我该如何解决呢?任何指针都非常感谢。

【问题讨论】:

  • 你做了两次res.json。它应该只做一次

标签: angularjs node.js mongodb express mean-stack


【解决方案1】:

您不能发送多个回复。

修复: 删除 return res.json(destPath); 并将所有代码从创建用户到保存实体,代替 return res.json(destPath);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2017-10-05
    • 2020-07-11
    相关资源
    最近更新 更多