Friday, 9 June 2017

Nodejs cannot send header after they are send

I already read many questions related to this topic, but every answer just say that i should put a return statement so it doesn't send 2 responses.

I understand that, but i keep getting the same error, even if i have a return for all the possible cases.

Check below:

 identifyNewPlant: function (req, res, next) {
    var genreId = req.params.id;
    var plantDescription = req.body.description;
    var flowerName = req.body.specie;
    var userId = req.userId;
    var bitmap = new Buffer(req.body.base64, 'base64');
    var fotoIdAux = req.fotoId;
    var fotoId = parseInt(fotoIdAux);

    var pathToSave = __dirname + "/../public/images/Thumbnail.jpg";
    var path = "public/images/" + flowerName + "/Thumbnail.jpg";


    fsPath.writeFile(pathToSave, bitmap, function (err) {
        if (err) {
            return (err);
        }

        Plant.create({
            specie: flowerName,
            description: plantDescription,
            directory: path,
            genreId: genreId,
            userId: userId
        }).then(function(plant){
            Foto.update({ plantId: plant.id, image: null }, {
                where: { id: fotoId }
            }).then(function (result) {
                return res.status(200).json({ message: "new plant identified with success" });
            }).catch(function (error) {
                return res.status(400).json({ error: "failed to identiy plant" })
            })
        }).catch(function(err){
            return res.send(400).json({error : "cannot create a new plant"});
        })
    });
}

this is my route that i created, and i get always the error on the last catch dunno why.

here is the stacktrace

Unhandled rejection Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11)
    at ServerResponse.header (C:\Users\FilipeCosta\Desktop\FloraApp\server\node_modules\express\lib\response.js:725:10)
    at ServerResponse.send (C:\Users\FilipeCosta\Desktop\FloraApp\server\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\Users\FilipeCosta\Desktop\FloraApp\server\node_modules\express\lib\response.js:256:15)
    at .<anonymous> (C:\Users\FilipeCosta\Desktop\FloraApp\server\controller\plants.js:97:38)
    at tryCatcher (C:\Users\FilipeCosta\Desktop\FloraApp\server\node_modules\sequelize\node_modules\bluebird\js\main\util.js:26:23)
    at Promise._settlePromiseFromHandler (C:\Users\FilipeCosta\Desktop\FloraApp\server\node_modules\sequelize\node_modules\bluebird\js\main\promise.js:503:31)
    at Promise._settlePromiseAt (C:\Users\FilipeCosta\Desktop\FloraApp\server\node_modules\sequelize\node_modules\bluebird\js\main\promise.js:577:18)
    at Promise._settlePromises (C:\Users\FilipeCosta\Desktop\FloraApp\server\node_modules\sequelize\node_modules\bluebird\js\main\promise.js:693:14)
    at Async._drainQueue (C:\Users\FilipeCosta\Desktop\FloraApp\server\node_modules\sequelize\node_modules\bluebird\js\main\async.js:123:16)
    at Async._drainQueues (C:\Users\FilipeCosta\Desktop\FloraApp\server\node_modules\sequelize\node_modules\bluebird\js\main\async.js:133:10)
    at Immediate.Async.drainQueues (C:\Users\FilipeCosta\Desktop\FloraApp\server\node_modules\sequelize\node_modules\bluebird\js\main\async.js:15:14)
    at runCallback (timers.js:672:20)
    at tryOnImmediate (timers.js:645:5)
    at processImmediate [as _immediateCallback] (timers.js:617:5)



via Filipe Costa

No comments:

Post a Comment