8768 sujets

Développement web côté serveur, CMS

Bonjour,

Après avoir abandonné un projet il y a trois ans je cherche à nouveau à me coller à Node.js à travers le framework Express 4. Mais 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 :
// 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 :
// 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(), mais je ne sais comment
})
module.exports = router

Merci pour vos éventuelles suggestions.
Modifié par Olivier C (27 Apr 2020 - 17:44)
En aparté :
niuxe a écrit :
C'est quoi ton projet ?

Réinventer la roue. Faire un site de A à Z avec des technos qui m'intéressent.

Il commence à émerger des tas de frameworks pour Node très bien foutus (en TypeScript et j'en passe). Mais je préfère suer à créer mon propre système que de me casser les dents à comprendre celui des autres.

Je suis un amateur et j'ai eu la fibre pour l'intégration, je me suis ensuite collé au templating sous WordPress. Mais maintenant je veux aller plus avant avec une maîtrise totale de mon code, avec un choix de technos qui me font kifer :
- pas de task runner ; auparavant j'utilisais Grunt, puis Gulp (et c'est comme cela que je me suis intéressé à Node.js, alors merci à eux) mais maintenant je trouve plus simple de tout faire en en ligne de commande (en plus d'avoir accès à beaucoup plus de modules), c'est infiniment moins verbeux **,
- PostgreSQL pour la base de donnée, en basant ma sémantique sur schema.org,
- Express 4 pour faire tourner le truc (c'est mon apprentissage le plus difficile, mais je trouve cela exaltant),
- Pug et Stylus pour le templating et le front (là je maîtrise).

Voili voilou...

____
** Exemple de configuration pour le css avec Stylus et Autoprefixer, puis minification avec bien sûr une map :
stylus -u autoprefixer-stylus -w public/styles/development/main.styl -o public/styles/main.css -c -m

La même chose avec Gulp (3.x) :
gulp.task( 'styles', function() { // Version de production
  return gulp
    .src( inputStyles )
    .pipe( plumber() )
    .pipe( sourcemaps.init() )
    .pipe( stylus( {
        compress : true,
        linenos : false // Commentaires indiquant la ligne du fichier Stylus impliqué
    } ) )
    .on('error', function( err ) {
        console.error( 'Error!', err.message );
    } )
    .pipe( autoprefixer( autoprefixerOptions ) )
    .pipe( sourcemaps.write( '../Styles/Maps', { addComment : true } ) )
    .pipe( gulp.dest( outputStyles ) )
    .pipe( bs.stream( { match : '**/*.css' } ) );
} );

Modifié par Olivier C (28 Apr 2020 - 06:25)
Olivier C a écrit :
Bonjour,

Après avoir abandonné un projet il y a trois ans je cherche à nouveau à me coller à Node.js à travers le framework Express 4. Mais 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 :
// models/articles.js
const db = require('../database')
const getArticle = (req, res, next) =&gt; db.one('SELECT * FROM article WHERE id = $1', req.params.id)
  .then(data =&gt; {
    res.render('article', data) // -&gt; je cherche à déplacer cette ligne dans le fichier "controllers/article.js"
  })
  .catch(error =&gt; {
    next()
  })
module.exports = { getArticle: getArticle }


Et mon fichier contrôleur pour les articles :
// 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) =&gt; { // ex: '/article/1'
  getArticle(req, res, next)
  // &lt;- c'est ici que je voudrais intégrer res.render(), mais je ne sais comment
})
module.exports = router

Merci pour vos éventuelles suggestions.

As-tu mis en place une page quelconque (site, Facebook, LinkedIn ou autre) sur laquelle on puisse suivre l'avancement de ton projet... les joies (y en aura), les peines (y en aura aussi), bref tout ce qui fait le charme d'un apprentissage.
Je pose la question parce que je viens tout juste d'intégrer la génération d'un serveur NodeJS dans mon propre développement et il pourrait être intéressant de mutualiser les expériences, histoire de comprendre, adapter, se faire plaisir ou pas sur ces nouvelles technos.
De mon côté, j'ai depuis peu mis en place, justement, un portail web prototype, une page Facebook, un compte Twitter, etc... sur lesquels je mets en ligne tout ce qui va et, a fortiori, tout ce qui a foiré et comment cela a pu être corrigé.
S'agissant d'un générateur, les corrections sont, forcément, adaptées à ce contexte mais la recherche des causes d'erreur et la façon de les traiter sous NodeJS peut toujours être un sujet intéressant pour qui veut s'intéresser à la chose.
Merci pour ton retour d'information...
En tout cas, cela fait toujours plaisir de voir que des particuliers se lancent dans des projets sans avoir a priori de visée commerciale (même si à terme ceci n'est pas forcément exclu).
Pour des infos complémentaires, tu peux te connecter sur le portail (coquille vide de contenu, en cours de construction) que j'ai mis en signature de mon profil, ou me contacter par messagerie privée.
sepecat a écrit :
les joies (y en aura), les peines (y en aura aussi), bref tout ce qui fait le charme d'un apprentissage.

J'aime beaucoup ton réalisme.
Modifié par Olivier C (28 Apr 2020 - 13:23)
Au final, la solution (trouvée grâce à une personne que je remercie vivement) :
// 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

// 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}
Meilleure solution