Model :

const fs = require('fs')
const path = require("path");

module.exports = class Product {
    constructor (title) {
        this.title = title;
    }
    save () {
// dans le dossier data, fichier products.json
        const p = path.join(path.dirname(process.mainModule.filename), 'data', 'products.json')
// on lit le fichier, on recoit un callback (err ou le contenu)
        fs.readFile(p, (err, fileContent) => {
            let products = [];
// si pas d'erreur je convertis le fichier 
            if (!err) {
                products = JSON.parse(fileContent);
            }
// et je met le resultat dans products
            products.push(this);
// j'enregistre dans le fichier les données au format string 
            fs.writeFile(p, JSON.stringify(products), (err) => {
                console.error(err);
            });
        });
    }

    static fetchAll (cb) {
        const p = path.join(path.dirname(process.mainModule.filename), 'data', 'products.json')
        fs.readFile(p, (err, fileContent) => {
            if (err) {
                cb([]);
            }
            cb(JSON.parse(fileContent));
        })
    }
	}

Autre facon d'ecrire le model :

const fs = require('fs')
const path = require("path");
const p = path.join(path.dirname(process.mainModule.filename), 'data', 'products.json')

const getProductsFromFile = (cb) => {
    fs.readFile(p, (err, fileContent) => {
        if (err) {
            return cb([]);
        } else {
            return cb(JSON.parse(fileContent));
        }
    })
}

module.exports = class Product {
    constructor (title) {
        this.title = title;
    }
    save () {
        getProductsFromFile(products => {
            products.push(this);
            fs.writeFile(p, JSON.stringify(products), (err) => {
                console.error(err);
            });
        });
    }
    static fetchAll (cb) {
        getProductsFromFile(cb);
    }
}

Controller :

const Product = require("./../models/product");

exports.getAddProduct = (req, res, next) => {
    res.render('add-product', {
        pageTitle: 'Add Product',
        path: '/admin/add-product',
        formsCSS: true,
        productCSS: true,
        activeAddProduct: true
    });
}

exports.postAddProduct = (req, res, next) => {
    const product = new Product(req.body.title);
    product.save();
    res.redirect('/');
}

exports.getProducts = (req, res, next) => {
    Product.fetchAll((products) => {
        res.render('shop', {
            prods: products,
            pageTitle: 'Shop',
            path: '/',
            hasProducts: products.length > 0,
            activeShop: true,
            productCSS: true
        });
    });
}
// pour l'utiliser ( dans le dossier routes, admin.js)
const path = require('path');
const express = require('express');
const productsController = require("../controllers/products");
const router = express.Router();

// /admin/add-product => GET
router.get('/add-product', productsController.getAddProduct);
// /admin/add-product => POST
router.post('/add-product', productsController.postAddProduct);

module.exports = router;