J'ai écrit un middleware dans express.js/node.js qui vérifie la session et s'il trouve un ID utilisateur, affiche le menu de l'utilisateur, ou bien, le menu par défaut.Pourquoi mon middleware est-il exécuté deux fois?
Chaque page demande les chèques d'un identifiant et récupère les données utilisateur de la base de données (id, nom, catégorie, etc.)
Voici le middleware:
module.exports = function(req,res,next){
console.log("INSIDE SESSION HANDLER");
if(!req.session.uid) return next();
else{
User.get(uid, function(user){
if (!user) {return next(err);}
else{
req.user = res.locals.user = user;
next();
}
})
}
}
Ensuite, vérifie EJS habitants et si il y a un ID, montre le menu de l'utilisateur.
Je chargais une page de test que je n'ai pas utilisé la bibliothèque socket.io, mais j'ai oublié de supprimer la ligne <script src="/socket.io/socket.io.js"></script>
.
<!DOCTYPE html>
<html>
<head>
<title><%= title %> , <%= settings.title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
<script src="/socket.io/socket.io.js"></script>//<== SHOULD DELETE THIS
<h1>Login</h1>
<%include menu%> //<== USES EJS TO CHECK LOCALS AND SHOW DEFAULT OR USER MENU
</head>
<body>
Lorsque la ligne script src
n'a pas été là, le middleware exécutait une fois (vu console.log("INSIDE SESSION HANDLER");
une seule fois).
Lorsque la ligne script src
était là, donnait apparemment une erreur 404, mais le middleware était en cours d'exécution deux fois (vu le console.log("INSIDE SESSION HANDLER");
deux fois).
est ici la sortie de console.log
:
INSIDE SESSION HANDLER
GET/304 66ms //page
GET /stylesheets/style.css 304 11ms
INSIDE SESSION HANDLER //again
GET /socket.io/socket.io.js 404 28ms - 1.04kb
GET /multimedia/01.jpg 304 4ms //images...
GET /multimedia/02.jpg 304 5ms
Je veux vraiment comprendre les demandes/réponses et middleware. Alors pourquoi cela se passe-t-il? Pourquoi ce middleware est-il exécuté deux fois à cause de l'erreur 404? Est-ce que la réponse à l'erreur 404 provoque l'exécution du middleware deux fois?
Merci
EDIT
J'utilise le middleware app.js comme ceci:
app.use(favicon(__dirname + '/node_modules/static-favicon/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({resave:'false', saveUninitialized:'false', secret:'secret'}));
app.use(express.static(path.join(__dirname, 'public')));
app.set('multimedia', __dirname + '/public/multimedia');
app.use(handler); //<= THE MIDDLEWARE IN QUESTION
app.use(messages);
app.get('/', routes.list);
app.get('/register', register.form);
app.post('/register', register.submitit);
Il se peut que 'express.static' ne puisse pas servir le fichier qui a été demandé, donc il a continué la chaîne de requête (aka '' next() ''), auquel cas il exécutera le' app.use (gestionnaire) 'middleware et tenter de faire correspondre d'autres routes plus bas, aucun-qui s'applique donc il montre un 404. En d'autres termes, Il se connecte une fois pour le chargement de la page, et une fois pour le 404. –
J'ai écrit le ci-dessus comment dans une réponse ci-dessous après avoir testé que c'est le cas. –