Partage
  • Partager sur Facebook
  • Partager sur Twitter

Difficulté pile de middleware NodeJS avec express4

    4 décembre 2018 à 11:29:29

    Bonjour à tous,

    Mon appli Rest est composée de 2 routers:

    indexRouter:

    router.use(function (req, res, next) {
        console.log("Webservice started at: ", new Date().toString());
        next();
    });
    router.get('/', function(req, res, next) {
      res.send("<h1>API Scores</h1>\n" +
          "<h2>Routes:</h2>\n" +
          "<h3 style='margin-left: 10%;'>/scores methods:</h3>\n" +
          "<p style='margin-left: 25%;'>GET - get all the scores</p>\n" +
          "<p style='margin-left: 25%;'>POST - insert a score</p>\n" +
          "<h3 style='margin-left: 10%;'>/scores/:id methods:</h3>\n" +
          "<p style='margin-left: 25%;'>GET - get an specific score</p>\n" +
          "<p style='margin-left: 25%;'>PUT - update an specific score</p>\n" +
          "<p style='margin-left: 25%;'>DEL - delete an specific score</p>");
    });
    
    module.exports = router;

    scoreRouter:

    router.use(function(req, res, next) {
        console.log('Time of API Call:', new Date().toString());
        console.log('Requested PATH:', req.path);
        console.log('Requested Method:', req.method);
    
        if(req.params.id || Object.keys(req.body).length !== 0){
            next();
        } else{
            next('route');
        }
    }, function (req, res, next) {
        if(req.params.id){
            console.log('Requested Param:', req.params.id);
        }
        if(req.body){
            console.log('Requested Body:', req.body.userIP,'-', req.body.name,'-', req.body.score);
        }
    });
    
    router.route('/scores')
    /* GET list of scores */
        .get(function (req, res) {
            Score.find(function (err, scores) {
                if (err){
                    res.send(err);
                }
                res.json(scores);
            });
        })
        /* POST insert a score */
        .post(function (req, res) {
            var newScore = new Score(req.body);
            newScore.save(function (err) {
                if (err){
                    return res.send(err);
                }
                res.json({message: 'Score added successfully'});
            });
        });

    et leur setting comme Routers par le serveur express dans app.js:

    app.use('/', indexRouter);
    app.use('/api', scoresRouter);


    Mon problème vient lorsque je fais appel aux méthodes CRUD du sous chemin /api, lors de l'appel de la pile de fonctions du middleware, par exemple pour un appel sur POST, je cherche à reproduire le comportement suivant:

    l'appli passe dans la première fonction sans point de montage du router et affiche les 3 lignes suivantes :

    console.log('Time of API Call:', new Date().toString());
    console.log('Requested PATH:', req.path);
    console.log('Requested Method:', req.method);

    ensuite si des paramètres sont présents dans le body de l'objet Request ou si un id (pour les chemins /scores/:id ..) est présent dans ce cas j'appelle next() pour passer sur la deuxième fonction de la sous pile qui affiche les messages suivants:

    if(req.params.id){
    console.log('Requested Param:', req.params.id);
    }
    if(req.body){
    console.log('Requested Body:', req.body.userIP,'-', req.body.name,'-', req.body.score);
    }

    Dans la cas contraire la première méthode appelle next('route') et passe directement dans le traitement CRUD.

    Hors actuellement le comportement de l'appli est que si elle passe sur next('route') le débuggueur m'amène directement à la fin de la méthode sans point de montage de l'indexRouter puis le traitement s'arrête. 

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter

    Difficulté pile de middleware NodeJS avec express4

    × 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