IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

Express 4 : séparation MVC


Sujet :

NodeJS

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2015
    Messages : 44
    Par défaut Express 4 : séparation MVC
    Bonjour, je tente de me mettre à Node.js à travers le framework Express 4, mais en plus de la découverte d'un nouvel environnement j'ai des lacunes en javascript.

    Il existe un générateur d’applications pour Express qui - s'il propose une base pour l'architecture d'une app - ne propose pas de découpage MVC : il sépare seulement les vues du reste de l'application entreposé dans un dossier "routes". Je cherche donc à désolidariser la logique métier du contrôleur.

    J'y suis presque, mais je bloque sur un point. Voilà où j'en suis pour le fichier dédié aux requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // models/articles.js
     
    const db = require('../database')
    const getArticle = (req, res, next) => db.one('SELECT * FROM article WHERE id = $1', req.params.id)
      .then(data => {
        res.render('article', data) // -> je cherche à déplacer cette ligne dans le fichier "controllers/article.js"
      })
      .catch(error => {
        next()
      })
    module.exports = { getArticle: getArticle }
    Et mon fichier contrôleur pour les articles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // controllers/articles.js
     
    const express = require('express')
    const router = express.Router()
    const { getArticle } = require('../models/article')
    router.get('/article/:id([0-9]{1,7})', (req, res, next) => { // ex: '/article/1'
      getArticle(req, res, next)
      // <- c'est ici que je voudrais intégrer res.render(), à la place de la fonction getArticle(), mais je ne sais comment
    })
    module.exports = router
    Merci pour vos éventuelles suggestions.

  2. #2
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 4
    Par défaut
    Salut Olivier, je vais essayer de répondre à ta question.
    Effectivement tu y est presque!

    Voici une piste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // models/articles.js
     
    const db = require('../database');
    const getArticle = async (id) => await db.one('SELECT * FROM article WHERE id = $1', id);
    module.exports = { getArticle: getArticle };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    // controllers/articles.js
     
    const express = require('express');
    const router = express.Router();
    const { getArticle } = require('../models/article');
     
    router.get('/article/:id([0-9]{1,7})', async (req, res, next) => { // ex: '/article/1'
      const article = await getArticle(req.params.id).catch(err => err);
      if(article instanceof Error) {
        return res.render('error', data);
      }
      res.render('article', data);
    })
    module.exports = router
    J'ai pas tester mais je pense que cela peut te mette sur la piste.

    Je te conseil de check la doc mdn ici pour la definition et utilisation de tes module JS que je n'ai pas modifié pour pas t'embrouiller:
    https://developer.mozilla.org/fr/doc.../Guide/Modules

    et aussi la doc des Promises et async function:
    https://developer.mozilla.org/fr/doc...lobaux/Promise
    https://developer.mozilla.org/fr/doc...async_function

    Redemande si jamais
    Bon courage.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2015
    Messages : 44
    Par défaut Un grand merci !
    Alors là... un grand grand merci à toi FazioNico ! Je pense que sans toi je n'y serais pas arrivé. Non seulement tu m'as mis sur la voie mais, au passage, j'ai appris plein de trucs. En m'inspirant de ton code j'ai résolu mon problème. J'avoue que je ne croyais plus trop à une aide sur ce forum car en regardant l'historique du forum node.js je le trouvais assez désertique au final... mais tu es passé par là "et la lumière fut" !

    Je poste ma solution, pour la postérité, mais surtout en gratitude à tous ceux qui donnent de leur temps pour aider les autres sur ce forum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // controllers/article.js
    'use strict'
     
    const express = require('express')
    const router = express.Router()
    const { getArticle } = require('../models/article')
     
    router.get('/article/:id([0-9]{1,7})', async (req, res, next) => { // @example '/article/1'
      const data = await getArticle(req.params.id)
        .then(data => {
          res.render('article', data) // si des données correspondent à la requête on envoie à la vue "article"
        })
        .catch(error => {
          next() // indispensable si la requête échoue, la demande sera traitée plus loin en erreur 404
        })
    })
     
    module.exports = router
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // models/article.js
    'use strict'
     
    const settings = require('./../settings')
    const db = require('../database')
     
    const getArticle = async (id) => await db.one('SELECT * FROM article WHERE id = $1', id)
        .then(data => {
          data.title = data.name + ' | ' + settings.siteName // un p'tit ajout au passage pour montrer ce qui justifie ici un then/catch, ici pour la balise title, ce pourrait être encore le traitement d'une date au bon format
          return data
        })
        .catch(error => { // cette partie n'est utile que si l'on cherche à traiter l'erreur
          console.log(error)
          return data
        })
     
    module.exports = {getArticle : getArticle}
    Bien entendu s'il existe une solution plus concise ou optimisée je suis preneur : pour éviter les 2 return sur le modèle j'ai tenté d'en mettre un seul dans un .finally() mais a priori je n'ai pas compris le concept...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ASP.NET MVC 3 en mode 32bits (iis express)
    Par durnambule dans le forum Développement Web avec .NET
    Réponses: 0
    Dernier message: 11/10/2012, 13h12
  2. [C#] MVC et séparation des données
    Par wiemwiem dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/06/2011, 09h59
  3. associer un icone à 1 application sous MVC++2010 express
    Par reiben_fr dans le forum Débuter
    Réponses: 1
    Dernier message: 28/04/2011, 15h01
  4. Expression Régulière séparation de mots majuscule
    Par orfaon dans le forum Langage
    Réponses: 5
    Dernier message: 03/03/2010, 14h49
  5. MVC et séparation des couches
    Par DeathMaker dans le forum MVC
    Réponses: 6
    Dernier message: 06/01/2009, 14h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo