In questo capitolo vedremo come visualizzare i dettagli di un singolo prodotto importato da WooCommerce nel nostro applicativo. Per visualizzare un singolo prodotto abbiamo bisogno di aggiungere un parametro ad una route specifica in ExpressJS contenente l'ID numerico del prodotto stesso:
app.get('/dashboard/view/:id', routes.singleProduct);
:id
è il parametro variabile che fa parte dell'oggetto request.params
gestito da Express. Una volta ottenuto l'ID. e convertitolo in un intero per onorare la coerenza dei dati con MongoDB, possiamo usarlo per reperire un prodotto:
singleProduct: (req, res) => {
let id = parseInt(req.params.id, 10);
req.db.connect().then(client => {
let db = client.db('db');
let products = db.collection('products');
products.findOne({id: id}).then(prod => {
res.render('single-product', {
title: prod.title + ' | WooCommerce Node',
product: prod
});
}).catch(err => {
res.redirect('/dashboard');
});
}).catch(err => {
res.redirect('/dashboard');
});
}
Il metodo .findOne()
, come gli altri metodi delle collezioni, strong>se usato senza una funzione di callback restituisce una
Il parametro passato deve necessariamente essere convertito in un intero poiché internamente MongoDB effettua un test di compatibilità tra i dati. Inoltre, poiché il parametro della route è sempre una stringa, dobbiamo convertirlo in intero se non vogliamo che la Promise venga rigettata.
Volendo semplificarci il lavoro possiamo effettuare una validazione del parametro direttamente nel path della route:
/dashboard/view/:id([0-9]+)
In questo modo siamo sicuri che il parametro dovrà essere una stringa di tipo numerico grazie all'espressione regolare associatagli che ci evita di dover validare il suo valore nella routine della nostra route.
Attraverso queste procedure abbiamo presentato un modo semplice con cui visualizzare i dettagli di un prodotto usando i metodi delle collezioni del driver per MongoDB. Come appare evidente, la validazione e la coerenza dei dati è un requisito fondamentale.