Bonjour,

Je partage d'abord mon code et explique ensuite mon problème

var express = require('express'); //Module express requis (Framework node js)
var http = require('http');

var path = require('path'); //Module Path requis, pour les chemins de fichier

//var util = require('util');

var bosyParser = require("body-parser"); //Utile pour lire les réponses des formulaires
var cookieSession = require('express-session');
var cookieParser = require('cookie-parser'); //La session est stocké dans un cookie, nous utilisons ce parse 

var bosyParser = require("body-parser");
var util = require('util');
var md5 = require('md5');

var app = express(); //Instantiation du serveur

app.set('port', process.env.PORT || 8080) //Port d'écoute
app.use(bosyParser.urlencoded({extended: true})); //Utile pour lire les données envoyés dans les formulaires.
app.use(express.static(path.join(__dirname, '../www'))); //Pour pouvoir utiliser des chemins relatifs dans les fichier utilisés

//Autorisé les cookie dans les entête html

app.use(cookieParser());
// Session management
// Internal session data storage engine, this is the default engine embedded with connect.
// Much more can be found as external modules (Redis, Mongo, Mysql, file...). look at "npm search connect session store"
app.use(cookieSession({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}))

var server = http.createServer(app).listen(app.get('port'), function(){
    console.log('Serveur express ouvert au port ' + app.get('port'));
}); //Création du serveur et écoute du port 8080

exports.server = server;

//Sert pour les inscription
app.post('/inscription', function(req, res){
    var name = req.body.inscriptionPseudo;
    var mdp = req.body.inscriptionPassword1;

    req.session.pseudo = name;

    var compte = new Object();
    compte.name = name;
    compte.mdp = mdp;
    compte.req = req;
    compte.res = res;

    db.executeSelectQuery("select * from user where pseudo = \'" +  name + "\'", inscription, compte);      

})

//Fonction qui gère le formulaire de connexion
app.post('/connexion', function(req,res){
    var name = req.body.connexionPseudo;
    var mdp = req.body.connexionPassword;

     // Increment "index" in session
      req.session.pseudo = name;

    var compte = new Object();
    compte.name = name;
    compte.mdp = mdp;
    compte.req = req;
    compte.res = res;

    var requette = "SELECT * FROM user WHERE pseudo = \'" + req.session.pseudo + "\' AND password = \'" + md5(mdp) + "\'";
    db.executeSelectQuery(requette, connexion, compte);

})

app.post('/co',function(req,res){
      console.log("Session id vaut : "+ req.session.pseudo);
      res.redirect('/home');

})

//On renvois le fichier index.html lorsque l'on cherche le chemin /
app.get('/', function(req, res){
    console.log('passe1');
    if(req.session.pseudo){

    console.log('passe2');
        res.redirect('/home');
    }else{
    console.log('passe3');
        res.redirect('/login');
    }
})

//On renvois le fichier index.html lorsque l'on cherche le chemin /
app.get('/login', function(req, res){
    res.sendFile(path.resolve(__dirname + '/../www/index.html')); //Envoi à la page de connection
})
h
//Renvois la page home
app.get('/home', /*[requireLogin],*/ function(req, res){
    res.sendFile(path.resolve(__dirname + '/../www/acceuil.html')); //Envoye la page d'accueil
})

EN gros mon problème est tous simple, je voudrais que lorsqu'un utilisateur tape l'adresse de mon site il tombe sur la route principale qui me semble être '/' . Mais il en est tout autrement, quoi qu'il arrive, l'utilisateur ne passe par aucune route et il est redirigé sur la page "index.html".

Je ne comprend pas pourquoi.

Quelqu'un serait-il la raison?

Merci d'avance.

10 réponses


Gatien Tafforeau
Auteur
Réponse acceptée

ça ne change rien, mais j'ai trouvé ce qui déconne, c'est que nativement, quand node js trouve un fichier index.html dans un répertoire il l'exécute sans lire les routes.

Si pseudo n'est pas défini en session, l'utilisateur est redirigé vers /login
et /login retourne index.html

Bonsoir.
Tu sembles bien aimer te contredire :

je voudrais que lorsqu'un utilisateur tape l'adresse de mon site il tombe sur la route principale qui me semble être '/' . Mais il en est tout autrement, quoi qu'il arrive, l'utilisateur ne passe par aucune route et il est redirigé sur la page "index.html".

Puis dans le commentaire correspondant à la racine du site :

On renvois le fichier index.html lorsque l'on cherche le chemin /

Si ta logique diffère entre le moment ou tu codes et ta réflexion externe, tu vas avoir du mal à t'en sortir.
Et puis je vois mal comment il est possible de rester à la racine de ton site étant donné que dans le routing correspondanttu ne fais que des redirections /login et /home.
Pour faire simple, voici la traduction de ton routing correspondant à l'appel de la racine du site :

  • Si l'utilisateur est connecté rediriges le vers /home
  • Si l'utilisateur n'est pas connecté rediriges le vers /login

Donc, dans les deux cas, lorsque la racine de ton site est appelée, l'utilisateur ne pourra jamais y accéder.

Merci pour la rapidités de vos réponses.

Je pense que j'ai dû mal m'expliquer, je sais très bien que :
-Si l'utilisateur est connecté rediriges le vers /home
-Si l'utilisateur n'est pas connecté rediriges le vers /login

c''est l'effet voulu. Mon problème n'est pas vraiment ça.

J'ai déclaré cette route :

app.get('/', function(req, res){
    console.log('passe1');
    if(req.session.pseudo){

    console.log('passe2');
        res.redirect('/home');
    }else{
    console.log('passe3');
        res.redirect('/login');
    }
})

Comme vous pouvez le voir, j'ai mis des log qui doivent s'afficher sur la console node.
Mais lorsque je tape "localhost:8080" aucun log précisant cette route ne s'affiche.

Je ne comprend pas comment ça se fait que je n'ai pas de log.

le console log ne ne se fait pas du tous dans le navigateur mais dans ta console node que tu lance pour executer le script

je le sais très bien...
J'affiche pas mal de message avec console.log(); donc je sais où il s'affiche.

Par hasard.

Lorsque tu fais un f5 (refresh), tu resterais pas sur /login ou autre ? Tu reviens bien sur / ?

Parce que le console.log chez moi il marche, en dehors du h qui se balade ligne 103.

ça ne change rien, mais j'ai trouvé ce qui déconne, c'est que nativement, quand node js trouve un fichier index.html dans un répertoire il l'exécute sans lire les routes.

Nativement, nodejs ne crée même pas de serveur HTTP. Tu es sûr que tu as pas un middleware qui fait ça plutôt ?

Je suis sûr de ne pas avoir de middleware qui le fasse.
Mais dans ce script node, j'ai déclaré :

app.use(express.static(path.join(__dirname, '../www')));

Ce qui permet à node js de savoir dans quel dossier chercher

A quoi set l'index.html du coup ? A rien non ?
Sinon tu peux jeter un coup d'oeil ici :
http://stackoverflow.com/questions/16088824/serve-static-files-and-app-get-conflict-using-express-js