Eine nette Technik, die ich mit einigen meiner Apps in Express verwendet habe, besteht darin, ein Objekt zu erstellen, das die Abfrage-, Parameter- und Textfelder des Express-Anforderungsobjekts zusammenführt.
//./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;
Dann können Sie in Ihrem Controller-Body oder an einer anderen Stelle im Bereich der Express-Anforderungskette Folgendes verwenden:
//./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);
});
Dies macht es schön und praktisch, einfach in alle "benutzerdefinierten Daten" einzutauchen, die ein Benutzer möglicherweise mit seiner Anfrage gesendet hat.
Hinweis
Warum das Feld "Requisiten"? Da dies ein abgeschnittenes Snippet war, verwende ich diese Technik in einer Reihe meiner APIs. Ich speichere auch Authentifizierungs- / Autorisierungsdaten auf diesem Objekt, Beispiel unten.
/*
* @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";
}
}