提问者:小点点

Mozilla抛出错误[ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头


各位开发人员!

我正在发送一个表单数据放请求到我的服务器上传一张照片。 代码如下:

null

router.put("/profile-pic/new/:id", async (req, res, next) => {
    try {
        let user = await User.findById(req.params.id);
        if (!user) return res.status(404).send("User not found...");
        let form = new formidable.IncomingForm();
        form.keepExtensions = true;
        form.parse(req, async (err, fields, files) => {
            if (err) return res.status(400).send("Image could not be uploaded.");
            else if (files.profilePic) {
                if (files.profilePic.size > 1000000) {
                    return res.status(400).send("Image can not be larger than 1MB");
                }
                await User.findByIdAndUpdate({ _id: user.id }, {
                    profilePic: {
                        data: fs.readFileSync(files.profilePic.path),
                        contentType: files.profilePic.type
                    }
                }, { useFindAndModify: false });
            }
        });
        res.send("Image uploaded successfully.");
    } catch (ex) {
        console.error(ex);
        next();
    }
});

null

到目前为止,我一直在使用Chrome制作这款应用程序,在那里,所有的服务器请求都能很好地工作。 我正在上传图片和一切都没有问题。 我想在Mozilla中测试应用程序,检查我是否犯了任何样式或布局错误,结果发现我的表单数据没有被正确解析,或者至少不是每次都被正确解析。 当我尝试上载图片时,会出现以下错误:

null

(node:9388) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:485:11)
    at ServerResponse.header (C:\Users\Lenovo\Desktop\InstaCringe\server\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (C:\Users\Lenovo\Desktop\InstaCringe\server\node_modules\express\lib\response.js:170:12)
    at C:\Users\Lenovo\Desktop\InstaCringe\server\routes\user.js:64:45
    at IncomingForm.<anonymous> (C:\Users\Lenovo\Desktop\InstaCringe\server\node_modules\formidable\lib\incoming_form.js:104:9)
    at IncomingForm.emit (events.js:210:5)
    at IncomingForm._error (C:\Users\Lenovo\Desktop\InstaCringe\server\node_modules\formidable\lib\incoming_form.js:298:8)
    at IncomingMessage.<anonymous> (C:\Users\Lenovo\Desktop\InstaCringe\server\node_modules\formidable\lib\incoming_form.js:134:14)
    at IncomingMessage.emit (events.js:215:7)
    at endReadableNT (_stream_readable.js:1184:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21)
(node:9388) 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(). (rejection id: 1)
(node:9388) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

null

我试了我能想到的一切,但什么都没有。 所以我只想知道这里到底发生了什么。。。我没有未处理的承诺拒绝,因为我将每个路由器包装到一个try-catch块中,如果有拒绝的承诺,就调用一个错误处理程序,所以我不知道发生了什么。 我也没有设置任何标题,什么如此。 在使用谷歌Chrome和在Mozilla中抛出错误时,它是如何完美无缺地工作的。 另外值得一提的是,在Mozilla中,图片的上传次数大约是10次中的1次。

我想我想知道的是,是我犯了什么愚蠢的错误,还是Mozilla就是Mozilla?


共2个答案

匿名用户

我认为,问题是最终的res.send(“image uploaded successfully.”);不在else中,因此每次都会执行它,也会在发生错误并且已经发送了重发时执行。 尝试将最后一个res.send()移动到else if下的else块中。

匿名用户

从理论上讲,

form.parse是一个异步函数。 也许您在想,每当向客户端发送响应时,您都在使用return语句。 但是,res.send(“image uploaded successfully.”);甚至在完成form.parse之前就已经执行了。 然后再从form.parse尝试向客户端发送响应。 这时就会出现错误。 与浏览器无关。