Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher un message d'erreur Node js Express js

Error: Can't set headers after they are sent.

    26 août 2016 à 21:19:13

    Bonjour a tous, je suis débutant et je fais des exercices pour comprendre comment fonctionne Node js avec le Framework Express. Dans mon code ci_dessous je tente d'afficher un message d'erreur a l'utilisateur si ce dernier tape un identifiant n’étant pas compris entre 1 et 3. J'ai essayé de plusieurs manières mais voici en générale le message d'erreur que je reçoit:

    <<  Error: Can't set headers after they are sent.  >>

    Merci d'avance !


    	'use strict';
    
    	module.exports = require('./lib/express');
    
    	
    	var ficheInfo=[
    	{
    		id:1,
    		nom:"Durand",
    		prenom:"Pierre"
    	},
    	{
    		id:2,
    		nom:"Dupont",
    		prenom:"Christophe"
    	},
    	{
    		id:3,
    		nom:"Martin",
    		prenom:"Michel"
    	
    	}
    	]
    
    	var express = require('express');
    	var bodyParser = require('body-Parser');
    	var app = express();
    	app.use('/JavaScript', express.static(__dirname + '/app/javascript'));
    	app.use('/lib', express.static(__dirname + '/app/lib'));
    	app.use(bodyParser.json());
    	app.get('/', function (req, res) {
    	res.sendFile(__dirname + '/app/exemple3.html');
    	});
    	app.get('/api/affiche/:id', function(req, res) {
    	for (var i=0;i<ficheInfo.length;i++) {
    		if (ficheInfo[i].id==req.params.id){
    		res.json(ficheInfo[i]);
    		}else{
    			res.setHeader("Content-Type", "text/html");
    			res.write("<p>L'identifiant que vous avez entre n'existe pas</p>");
    		}
    	}
    	res.send();
    	});
    	app.listen(8080);



    -
    Edité par jeanphill 26 août 2016 à 21:23:25

    • Partager sur Facebook
    • Partager sur Twitter
      26 août 2016 à 23:56:46

      Hi, 

      Essaye ça

      if (ficheInfo[i].id==req.params.id){
            return res.json(ficheInfo[i]);
          }else{
            return res.write("<p>L'identifiant que vous avez entre n'existe pas</p>");
          }


      c'est pas la solution, dis moi juste si t'as toujours l'erreur 

      le problème c'est qu'avec ta boucle si tu vas plus haut que id == 1 tu auras forcément l'erreur

      ça devrait marcher comme ça : 

      app.get('/:id', function(req, res) {
        res.setHeader("Content-Type", "text/html");
        for (var i=0;i<ficheInfo.length;i++) {
          if (ficheInfo[i].id==req.params.id) {
             return res.json(ficheInfo[i]);
          }
      }
          return res.end('Not found');
      });

      N'oublie pas de rechanger le chemin '/:id' que j'ai utilisé



      -
      Edité par Yo4n 27 août 2016 à 0:43:55

      • Partager sur Facebook
      • Partager sur Twitter
        27 août 2016 à 10:19:40

        Salut,

        Déjà je t'invite à mettre tes require('module') au début de ton code.

        Ensuite, je pense qu'en déplaçant ton app.get('/') à sa juste place (tout à la fin du code), ton problème sera résolu.

        D'autre part, pour envoyer tes réponses, j'utilises plutot cette syntaxe qui est bien plus simple et lisible:

        res.render('users/profil.jade', {title: 'Un titre', user: req.session.user, userManaged: unObjet, moment: moment});



        • Partager sur Facebook
        • Partager sur Twitter
          28 août 2016 à 15:11:52

          Bonjour et merci pour votre aide, j'ai tester tous vos conseils mais ça ne marche toujours pas. voici le code complet de mon programme.

          Serveur Node js (Express)
          /*!
          	 * express
          	 * Copyright(c) 2009-2013 TJ Holowaychuk
          	 * Copyright(c) 2013 Roman Shtylman
          	 * Copyright(c) 2014-2015 Douglas Christopher Wilson
          	 * MIT Licensed
          	 */
          
          	'use strict';
          
          	module.exports = require('./lib/express');
          
          	var ficheInfo=[
          		{
          		id:1,
          		nom:"Durand",
          		prenom:"Pierre"
          		},
          		{
          		id:2,
          		nom:"Dupont",
          		prenom:"Christophe"
          		},
          		{
          		id:3,
          		nom:"Martin",
          		prenom:"Michel"
          		}
          	] 
          	
          	var express = require('express');
          	var bodyParser = require('body-Parser');
          	var app = express();
          	
          	app.use(bodyParser.json());
          	app.use('/Javascript', express.static(__dirname + '/app/javascript'));
          	app.use('/lib', express.static(__dirname + '/app/lib'));
          	
          	app.get('/', function(req, res) {
          		res.sendFile(__dirname + '/app/test.html');
          	});
          	
          	app.get('/api/affiche/:id', function(req, res) {
          		for(var i = 0; i < ficheInfo.length; i++)
          		{
          			if(ficheInfo[i].id == req.params.id) {
          				res.json(ficheInfo[i]);
          	                 }else {??????}
                          }	
          		res.send();
          	});
          	
          	app.listen(8080);
           Page HTML
          <!doctype html>
          <html lang="fr">
          	<head>
          		<meta Charest="UTF-8">
          		<title>Test AngularJS</title>
          		
          	</head>
          	<body ng-app="myApp" ng-controller="monControl">
          			
          		
          		<form>
          			<p>Recherche par n° de fiche <input type:'text' ng-model="ident"></p>
          			<button ng-click="afficheFiche()">Valider</button>
          		</form>
          		
          		<h3>résultat recherche</h3>
          		<p>Nom : {{fiche.nom}}</p>
          		<p>Prénom : {{fiche.prenom}}</p> 
          		
          		
          		<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js" ></script>
          		<script src="lib/angular.min.js"></script>
          		<script src="Javascript/test.js"></script>
          	</body>
          </html>

          Code Javascript  

          angular.module('myApp', [])
          	.controller('monControl', function($scope, $http) {
          	
          		$scope.afficheFiche = function() {
          			$http.get('/api/affiche/'+$scope.ident)
          			.success(function(data) {
          				$scope.fiche = data;
          				$scope.ident = "";
          			})
                                  .error(function(data) {
          				$scope.error = data;
          				$scope.ident = "";
          			})
          		}
          	});






          -
          Edité par jeanphill 28 août 2016 à 17:58:43

          • Partager sur Facebook
          • Partager sur Twitter
            5 septembre 2016 à 10:44:07

            Peux-tu me dire de quel fichier il s'agit?

            Tu as normalement un fichier app.js  à la racine de ton programme qui doit contenir un code du genre (jte mets le code mon site avec tous les modules etc)

            var express = require('express');
            var path = require('path');
            var favicon = require('serve-favicon');
            var logger = require('morgan');
            var cookieParser = require('cookie-parser');
            var bodyParser = require('body-parser');
            var helmet = require('helmet'); // gère des failles de sécurité
            
            var routes = require('./routes/index');
            var users = require('./routes/users');
            var contact = require('./routes/contact');
            var admin = require('./routes/admin');
            
            var app = express();
            
            // view engine setup
            app.set('views', path.join(__dirname, 'views'));
            app.set('view engine', 'jade');
            
            app.use(favicon(path.join(__dirname, 'public/images', 'smileyKiss.png')));
            app.use(logger('dev'));
            app.use(bodyParser.json());
            app.use(bodyParser.urlencoded({ extended: false }));
            app.use(cookieParser());
            app.use(express.static(path.join(__dirname, 'public')));
            app.use(helmet());
            
            app.use('/', routes);
            app.use('/users', users);
            app.use('/contact',contact);
            app.use('/admin', admin);
            
            app.disable('x-powered-by'); // minimum requis -> empèche de cibler directement les appli express
            
            // catch 404 and forward to error handler
            app.use(function(req, res, next) {
              var err = new Error('Not Found');
              err.status = 404;
              next(err);
            });
            
            // error handlers
            
            // development error handler
            // will print stacktrace
            if (app.get('env') === 'development') {
              app.use(function(err, req, res, next) {
                res.status(err.status || 500);
                res.render('error', {
                  message: err.message,
                  error: err
                });
              });
            }
            
            // production error handler
            // no stacktraces leaked to user
            app.use(function(err, req, res, next) {
              res.status(err.status || 500);
              res.render('error', {
                message: err.message,
                error: {}
              });
            });
            
            
            module.exports = app;


            Tu noteras l'ordre dans lequel j'appelle les modules QUI EST PRIMORDIAL:


            1- appeler les modules;

            2- on informe express des différentes routes du programme;

            3- à la fin on exporte la variable app.

            Ensuite, tu dois avoir un fichier/bin/www (sans extension)

            #!/usr/bin/env node
            
            /**
             * Module dependencies.
             */
            
            var app = require('../app');
            var debug = require('debug')('monSitePerso:server');
            var http = require('http');
            
            /**
             * Get port from environment and store in Express.
             */
            
            var port = normalizePort(process.env.PORT || '3000');
            app.set('port', port);
            
            /**
             * Create HTTP server.
             */
            
            var server = http.createServer(app);
            
            /**
             * Listen on provided port, on all network interfaces.
             */
            
            server.listen(port);
            server.on('error', onError);
            server.on('listening', onListening);
            
            var io = require('../io');
            io.attach(server);
            
            
            /**
             * Normalize a port into a number, string, or false.
             */
            
            function normalizePort(val) {
              var port = parseInt(val, 10);
            
              if (isNaN(port)) {
                // named pipe
                return val;
              }
            
              if (port >= 0) {
                // port number
                return port;
              }
            
              return false;
            }
            
            /**
             * Event listener for HTTP server "error" event.
             */
            
            function onError(error) {
              if (error.syscall !== 'listen') {
                throw error;
              }
            
              var bind = typeof port === 'string'
                ? 'Pipe ' + port
                : 'Port ' + port;
            
              // handle specific listen errors with friendly messages
              switch (error.code) {
                case 'EACCES':
                  console.error(bind + ' requires elevated privileges');
                  process.exit(1);
                  break;
                case 'EADDRINUSE':
                  console.error(bind + ' is already in use');
                  process.exit(1);
                  break;
                default:
                  throw error;
              }
            }
            
            /**
             * Event listener for HTTP server "listening" event.
             */
            
            function onListening() {
              var addr = server.address();
              var bind = typeof addr === 'string'
                ? 'pipe ' + addr
                : 'port ' + addr.port;
              debug('Listening on ' + bind);
            }

            qui gère à proprement parler le/les ports utilisé(s). dans mon cas tu notera qu'il y a un port dédié au http et un au websocket.

            Enfin, tu as les routes et les vues (chacun dans le répertoire /routes et /views qui sont à la racine du programme).

            les routes doivent "chopper" les URL. Tu dois avoir une route par défault appelée index.js contenant un code du genre:

            var express = require('express');
            var router = express.Router();
            var session = require('express-session');
            var cookieParser = require('cookie-parser');
            var bodyParser = require('body-parser');
            
            var i = 0; // pour gérer l'arriver sur le site
            
            // gestion des sessions
            router.use(cookieParser())
                .use(session({
                    secret: 'unTrucSecretDeSecurite',
                    saveUninitialized: false,
                    resave: false,
                    cookie: {maxAge: 3600000}
                }))
                .use(bodyParser.urlencoded({
                    extended: false
                })
            );
            
            router.get('/jeuMulti/:pageDemandee', function(req, res, next){
                var pageDemandee = req.params.pageDemandee;
                var user = req.session.user;
                var jeuMulti = false;
                
                if(user){
                    if(req.url == '/jeuMulti/listeParties'){
                        jeuMulti = true;
                    }
                    res.render('jeuMulti/' + pageDemandee, {user: user, jeuMulti: jeuMulti});
                } else {
                    res.render('users/connection', {title: 'Connection', message: 'Vous devez être connecté pour pouvoir jouer!'});
                };
            });
            
            router.get('/:pageDemandee', function(req, res, next){
                var pageDemandee = req.params.pageDemandee;
                var message;
                var user;
                var userSession = req.session;
                console.log(userSession);
                if(req.session.user){
                    user = req.session.user;
                    if(i<1){
                        message = 'Content de te voir ' + user.nom + '!';
                        i++;
                    };
                };
                res.render('bases/' + pageDemandee, {title: pageDemandee, message: message, user: user});
            });
            
            /* GET home page. */
            router.get('/', function(req, res, next) {
                console.log('route de index');
                var message;
                var user;
                if(req.session.user){
                    user = req.session.user;
                    if(i<1){
                        message = 'Content de te voir ' + user.nom + '!';
                        i++;
                    };
                };
                res.render('index', {message: message, user: user, jeuSolo: true});
            });
            
            module.exports = router;


            En premier, on "invoque" les modules, en second on crée les routes en terminant par la route racine. Et enfin on exporte la route.

            Si tu n'as pas cette structure de fichiers, je t'invite à relire cette page: http://expressjs.com/fr/starter/generator.html   C'est pratique et ça fait gagner un temps monstre.

            Concernant AngularJS... J'ai moi aussi un petit problème dessus en ce moment mais si tu veux, on peut échanger en mp à ce sujet (peut-être quon réussira à s'entre débuguer ;-))

            La seule chose que je peux te dire c'est que pour utiliser Angular, la seule chose que j'ai eu à faire c'est dans mon fichier /public/javascripts/angularDeMonForm.js

            var App = angular.module('unNomDeTonChoix', []);
            // gère la partie sur le mdp
            App.controller('mdpEdition', [function() {
                
                this.verifConfirmation = function(){
                    // fait un truc
                };
                
                this.verifPassW = function(){
                    // fait un truc
                };
                
            }]);

            et ensuite mettre ng-controller="mdpEdition as mdpEdition" dans ma vue et piouf magie ça fonctionne.

            -
            Edité par Ben_ben_ben 5 septembre 2016 à 11:15:25

            • Partager sur Facebook
            • Partager sur Twitter
              11 septembre 2016 à 15:13:39

              Merci beaucoup je ferai comme tu me l'as dit
              • Partager sur Facebook
              • Partager sur Twitter

              Afficher un message d'erreur Node js Express js

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown