EricLeCodeur
Eric Le Codeur

Follow

Eric Le Codeur

Follow
NodeJS + Express partie 5 : Routes et Controllers

NodeJS + Express partie 5 : Routes et Controllers

EricLeCodeur's photo
EricLeCodeur
·Nov 1, 2021·

4 min read

Voici une série d'articles qui vous permettra de créer des applications backend avec NodeJS + Express.

Cette série est la suite de ma série sur les bases de NodeJS. Si vous n'avez pas les connaissances de bases en NodeJS lisez cette série d'abord : Introduction à NodeJS

Node.js est aujourd'hui un incontournable, il est donc essentiel pour un développeur de le maîtriser.

Je vais donc publier un nouvel article environ aux deux jours et petit à petit vous apprendrez tout ce qu'il y a à savoir sur Node.js + Express

Pour ne rien manquer suivez-moi sur twitter : twitter.com/EricLeCodeur


Express Router

Comme vous l'avez vu dans l'article précédent, créer une API CRUD avec Express est simple. Mais vous devriez avoir remarqué maintenant que tout ce code dans le même fichier c'est volumineux et nous allons bientôt nous perdre.

Par convention, les développeurs Express divisent le code en différents fichiers et dossiers pour optimiser l'organisation du code.

La première chose à faire, et la plus évidente, est de séparer la route et le code d'implémentation de la route.

Voici un exemple que nous utilisons dans l'article précédent

app.get('/api/products/:productID', (req, res) => {
    const id = Number(req.params.productID)
    const product = products.find(product => product.id === id)

        if (!product) {
        return res.status(404).send('Product not found')
    }
    res.json(product)
})

Le but ici sera de scinder la route et son code d'implémentation. Pour ce faire, nous pouvons utiliser un package Express appelé Router

Le Router aide à créer une liste de toutes vos routes d'applications et à les associer à un fichier de contrôleur contenant le code d'implémentation.

La première étape consiste à créer un fichier pour mettre toutes nos routes pour une ressource en particulier. Par exemple : /routes/products.js peut contenir toutes les routes liées à la ressource produit

Et à l'étape suivante, nous allons créer un fichier de contrôleur pour mettre tous nos codes d'implémentation de routes. Par exemple : /controllers/products.js

Voici un exemple de route et un fichier de contrôleur.

routes/products.js

const express = require('express')
const router = express.Router()

const  { 
    getProducts,
    getProduct,
    createProduct,
    updateProduct,
    deleteProduct 
} = require('../controllers/products.js')

router.get('/', getProducts)

router.get('/:productID', getProduct)

router.post('/', createProduct) 

router.put('/:productID', updateProduct) 

router.delete('/:productID', deleteProduct)

module.exports = router

Comme vous pouvez le voir, la mise en œuvre est très simple et directe.

Créez d'abord une instance de l'objet Router

Importez ensuite toutes les fonctions du contrôleur.

Enfin, utilisez l'objet routeur pour créer une association de route et de contrôleur.

Voici un exemple des fonctions du contrôleur controllers/produits.js

const products = require('../data.js')

const getProducts = ((req, res) => {
    res.json(products)
})

const getProduct = ((req, res) => {
    const id = Number(req.params.productID)
    const product = products.find(product => product.id === id)

        if (!product) {
        return res.status(404).send('Product not found')
    }
    res.json(product)
})

const createProduct = ((req, res) => {
    const newProduct = {
        id: products.length + 1,
        name: req.body.name,
        price: req.body.price
    }
    products.push(newProduct)
    res.status(201).json(newProduct)
})

const updateProduct = ((req, res) => {
    const id = Number(req.params.productID)
    const index = products.findIndex(product => product.id === id)
    const updatedProduct = {
        id: products[index].id,
        name: req.body.name,
        price: req.body.price
    }

    products[index] = updatedProduct
    res.status(200).json('Product updated')
})

const deleteProduct = ((req, res) => {
    const id = Number(req.params.productID)
    const index = products.findIndex(product => product.id === id)
    products.splice(index,1)
    res.status(200).json('Product deleted')
})

module.exports = {
    getProducts,
    getProduct,
    createProduct,
    updateProduct,
    deleteProduct
}

Rien de vraiment nouveau ici, c'est la même implémentation mais le code est maintenant dans des fonctions séparées avec un paramètre req et res.

Une fois les routes et les fichiers de contrôleurs créés, nous devons dire à Express d'utiliser ces routes

À partir du fichier principal, ajoutez un app.use() avec notre référence d'itinéraires

const express = require('express')
const app = express()
const products = require('./data.js')
const products_routes = require('./routes/products.js')

app.listen(5000, () => {
    console.log('server is listening on port 5000')
})

app.use(express.json())
app.use('/api/products', products_routes)

Notez que app.use() a un préfixe de routes dans '/api/products' qui signifie que tous les chemins d'URL dans le fichier de routes incluront automatiquement ce préfixe.

Conclusion

C'est tout pour aujourd'hui, suivez moi sur twitter : twitter.com/EricLeCodeur afin d'être avisé de la parution du prochain article (d'ici deux jours).

 
Share this