Une belle technique que j'ai commencé à utiliser avec certaines de mes applications sur express consiste à créer un objet qui fusionne la requête, les paramètres et les champs de corps de l'objet de demande 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;
Ensuite, dans votre corps de contrôleur, ou n'importe où ailleurs dans le cadre de la chaîne de demande express, vous pouvez utiliser quelque chose comme ci-dessous:
//./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);
});
Cela rend agréable et pratique de simplement "fouiller" dans toutes les "données personnalisées" qu'un utilisateur peut avoir envoyées avec sa demande.
Remarque
Pourquoi le champ «accessoires»? Étant donné qu'il s'agissait d'un extrait coupé, j'utilise cette technique dans un certain nombre de mes API, je stocke également des données d'authentification / autorisation sur cet objet, exemple ci-dessous.
/*
* @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";
}
}