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;