2017-05-29 4 views
0

Ich stoße also auf ein Problem mit ExpressJS und finde keine Dokumentation, um das Problem zu lösen.ExpressJS "Fehler: Kann Header nicht festlegen, nachdem sie gesendet werden."

Tech:

  • Körper-Parser: 1.17.0
  • exprimieren 4.15.0
  • multer: 1.3.0
  • MongoDB
  • Postman

Ansicht ist derzeit 3 Felder:

  • Name (erforderlich)
  • Tagline (erforderlich)
  • Bild (optional)

Was ich versuche zu tun, Fehler Handle auf das Bild, bevor Sie etwas schreiben in die Datenbank. Das Bild kann nur von mime typeimage/jpeg oder image/png sein, um zu verhindern, dass HTML mit schädlichen JS hochgeladen wird.

Ich glaube, das Problem scheint zu sein, dass ich nicht richtig einen Fehler Auslösung während Sie durch die Bildprüfung conditionals laufen und mehrere Antworten zu senden, die die Error: Can't set headers after they are sent.

Aufrechnungs

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) 
    }); 
}); 

Thema Forschung

+0

Ich würde sagen, das Problem ist in den letzten paar Zeilen. Wenn "err" * truthy * ist, versuchen Sie, den Fehler über 'res.send (err)' ** und ** zu senden, setzen Sie den Status auf 200 und antworten Sie mit JSON über 'res.status (200) .json (trinken) '. Sie sollten diesen letzten Teil wahrscheinlich in einen 'else'-Block schreiben. – Phil

+0

Wenn Sie genauer hinsehen, fehlen Ihnen bei der Behandlung von Fehlerbedingungen einfach Exit-Klauseln. Nichts in Ihrem Code stoppt die Verarbeitung, nachdem Sie versucht haben, mit einem Fehlerstatus zu antworten. Der Aufruf von 'res.send' stoppt die Fortführung des Codes nicht – Phil

+0

Es tut uns leid, ein wenig verwirrt darüber zu sein, wie wir dieses Lesen über Ihren ersten Kommentar angehen können. Wo diese Verwirrung auftritt, muss ein Fehler bei der Übergabe des Bildtyps vorliegen, und wenn ein Fehler beim Erstellen des Objekts in der Datenbank auftritt. Indem ich die Freiheit gebe, optional ein Bild hochladen zu können, weiß ich nicht genau, wie ich das machen soll.Das 'createDrink' würde meiner Meinung nach eine eigene Fehlerbehandlung beim Schreiben in die DB haben und der Bildtyp ist anders als Wie für den 2. Kommentar habe ich versucht mit' res.end() 'den Prozess zu stoppen, aber immer noch einige gleiche Ergebnisse. –

Antwort

0

Dieses Problem ist Javascript die asynchrone Natur zurückzuführen.

Der Code sollte Drink.createDrink() nach der Antwort error 500 nicht ausführen.

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

Laufen in ein anderes Problem. Scheint wie 'drinkImage.mimetype! ==" image/jpeg "|| drinkImage.mimetype! ==" image/png "' Führt dazu, dass der Code jedes Mal fehlschlägt. Allerdings 'drinkImage.mimetype! ==" image/jpeg "' funktioniert wie erwartet oder 'drinkImage.mimetype! ==" image/png "'. Gibt es eine andere Möglichkeit, den OR-Operator dort zu schreiben? –

+0

Muss zu frustrierend sein. Sollte && sein. Danke für die Hilfe, die 'Rückkehr' war die Lösung. 'drinkImage.mimetype! ==" image/jpeg "&& drinkImage.mimetype! ==" image/png "' –

+0

Ich bin froh, dass ich helfen konnte :) – haotang

Verwandte Themen