ExpressJS“错误:发送后无法设置标题。”

时间:2017-05-29 23:43:42

标签: javascript node.js express

所以我遇到了ExpressJS的问题,似乎无法找到解决问题的文档。

技术:

  • body-parser:1.17.0
  • express 4.15.0
  • multer:1.3.0
  • MongoDB的
  • 邮差

查看目前有3个字段:

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

我要做的是在将任何内容写入数据库之前对图像进行错误处理。该图片只能是mime type image/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)
  });
});

主题研究

1 个答案:

答案 0 :(得分:0)

此问题是由于Javascript的异步性质。

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

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!
}