2017-05-29 67 views
0

所以我遇到了ExpressJS的问题,似乎无法找到解决问题的文档。“错误:发送后无法设置标头。”

技术:

  • 体的解析器:1.17.0
  • 表达4.15.0
  • multer:1.3.0
  • MongoDB的
  • 邮差

查看当前3个字段:

  • 名称(必须)
  • 标语(必填)
  • 图片(可选)

我试图做的是错误句柄的图像写入任何东西之前进入数据库。该图片只能是mime typeimage/jpegimage/png,以防止HTML与恶意JS一起上传。

我相信这个问题似乎是,我没有正确触发错误,通过图像检查条件语句运行并发送多个响应而被掀起Error: Can't set headers after they are sent.

drinks.routes.js

var express = require('express'); 
var router = express.Router(); 
var jwt = require('jsonwebtoken'); 
var multer = require('multer'); 
var passport = require('passport'); 
var config = require('../config/main'); 
var upload = multer({ dest: 'uploads/images' }) 

var Drink = require('../models/drinks.model.js'); 

router.use(function(req, res, next){ 
    next(); 
}); 

... 

.post(passport.authenticate('jwt', { session: false }), upload.single('image'), function(err, req, res, next){ 
    var drink = req.body; 
    var drinkImage = req.file; 
    if(typeof drinkImage !== "undefined"){ 
    console.log('image was uploaded'); 
    if(drinkImage.mimetype !== "image/jpeg" || drinkImage.mimetype !== "image/png"){ 
     console.log('Image was not a JPEG or PNG', drinkImage.mimetype); 
     res.status(500).send({ error: "Your image was incorrect"}); // >>>>>>>>>>>>>>> The error seems to be coming from here. Unsure of how to properly raise a flag to tell the response to the client. Have tried res.send(), the res.status().send(), res.json(), currently working with next() method to keep going on but not sure how to define err if that is the case 
    } 
    console.log('image correct mimetype'); 
    } else { 
    drinkImage = {}; // Setting this as an empty object so it doesn't throw an error with the model which is looking for `image: drinkImage.name` 
    } 
    Drink.createDrink(drink, drinkImage, function(err, drink, drinkImage){ 
    if(err){ 
     console.log('Error adding Drink', err); 
     res.send(err); 
    } 
    res.status(200).json(drink) 
    }); 
}); 

主题研究

+0

我想说问题出现在最后几行。如果'err'是* truthy *,你试图通过'res.send(err)**和**发送错误,并且将状态设置为200,并通过'res.status(200).json响应一些JSON (饮料)'。您应该将最后一部分放在'else'块中 – Phil

+0

进一步看,在处理错误条件时,您只是缺少退出子句。尝试响应错误状态后,代码中的任何内容都不会停止处理。调用'res.send'并不会阻止代码继续运行 – Phil

+0

对不起,有点困惑于如何通过您的第一条评论来解决这个问题。如果出现混淆,那么需要对图像类型进行错误处理,并且如果在数据库中创建对象时发生错误。通过给予选择性上传图片的自由度,我不清楚如何进行这项工作。'createDrink'我认为会有它自己的错误处理写入数据库和图像类型是不同的 至于第二个评论曾尝试使用'res.end()'来停止进程,但仍然有一些相同的结果。 –

回答

0

此问题是由于JavaScript的异步特性。

回应error 500后代码不应执行Drink.createDrink()

if (drinkImage.mimetype !== "image/jpeg" || drinkImage.mimetype !== "image/png") { 
    console.log('Image was not a JPEG or PNG', drinkImage.mimetype); 
    res.status(500).send({ error: "Your image was incorrect"}); 
    return; // THIS IS VERY IMPORTANT! 
} 
+0

遇到另一个问题。似乎像'drinkImage.mimetype!==“image/jpeg”|| drinkImage.mimetype!==“image/png”'每次都会导致代码失败,但'drinkImage.mimetype!=='image/jpeg“'按预期工作或'drinkImage.mimetype!==“image/png”'。有没有另外一种方法来写OR操作符? –

+0

一定是太沮丧了。应该是&&。感谢您的帮助,'return'是解决方案。'drinkImage.mimetype!==“image/jpeg”&& drinkImage.mimetype!==“image/png”' –

+0

很高兴我可以帮忙:) – haotang

相关问题