Una buona tecnica che ho iniziato a utilizzare con alcune delle mie app su express è quella di creare un oggetto che unisce i campi query, params e body dell'oggetto richiesta di express.
//./express-data.js
const _ = require("lodash");
class ExpressData {
/*
* @param {Object} req - express request object
*/
constructor (req) {
//Merge all data passed by the client in the request
this.props = _.merge(req.body, req.params, req.query);
}
}
module.exports = ExpressData;
Quindi, nel corpo del controller o in qualsiasi altro ambito della catena di richieste espresse, è possibile utilizzare qualcosa di simile al seguente:
//./some-controller.js
const ExpressData = require("./express-data.js");
const router = require("express").Router();
router.get("/:some_id", (req, res) => {
let props = new ExpressData(req).props;
//Given the request "/592363122?foo=bar&hello=world"
//the below would log out
// {
// some_id: 592363122,
// foo: 'bar',
// hello: 'world'
// }
console.log(props);
return res.json(props);
});
Questo rende piacevole e pratico "approfondire" tutti i "dati personalizzati" che un utente potrebbe aver inviato con la sua richiesta.
Nota
Perché il campo 'oggetti di scena'? Poiché si trattava di uno snippet ridotto, utilizzo questa tecnica in diverse mie API, inoltre memorizzo i dati di autenticazione / autorizzazione su questo oggetto, esempio di seguito.
/*
* @param {Object} req - Request response object
*/
class ExpressData {
/*
* @param {Object} req - express request object
*/
constructor (req) {
//Merge all data passed by the client in the request
this.props = _.merge(req.body, req.params, req.query);
//Store reference to the user
this.user = req.user || null;
//API connected devices (Mobile app..) will send x-client header with requests, web context is implied.
//This is used to determine how the user is connecting to the API
this.client = (req.headers) ? (req.headers["x-client"] || (req.client || "web")) : "web";
}
}