Eine schöne Technik, die ich bei einigen meiner Apps auf Express begonnen habe zu verwenden, besteht darin, ein Objekt zu erstellen, das die Abfrage-, Parameter- und Body-Felder des Express-Anfrageobjekts zusammenführt.
//./express-data.js
const _ = require("lodash");
class ExpressData {
/*
* @param {Object} req - Express-Anfrageobjekt
*/
constructor (req) {
//Alle vom Client übergebenen Daten in der Anfrage zusammenführen
this.props = _.merge(req.body, req.params, req.query);
}
}
module.exports = ExpressData;
Dann können Sie beispielsweise in Ihrem Controller oder an anderer Stelle im Umfang der Express-Anfragekette etwas Ähnliches 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;
//Angenommen, die Anfrage lautet "/592363122?foo=bar&hello=world"
//das folgende würde ausgeben
//{
// some_id: 592363122,
// foo: 'bar',
// hello: 'world'
//}
console.log(props);
return res.json(props);
});
Das macht es schön und praktisch, einfach in alle "benutzerdefinierten Daten" abzutauchen, die ein Benutzer mit seiner Anfrage gesendet haben könnte.
Hinweis
Warum das 'props' Feld? Da dies ein gekürztes Beispiel war, verwende ich diese Technik in einer Reihe meiner APIs, ich speichere auch Authentifizierungs- / Autorisierungsdaten auf diesem Objekt, wie im folgenden Beispiel.
/*
* @param {Object} req - Anfrage-Antwort-Objekt
*/
class ExpressData {
/*
* @param {Object} req - Express-Anfrageobjekt
*/
constructor (req) {
//Alle vom Client übergebenen Daten in der Anfrage zusammenführen
this.props = _.merge(req.body, req.params, req.query);
//Verweis auf den Benutzer speichern
this.user = req.user || null;
//API-verbundene Geräte (Mobile App..) senden x-client-Header mit Anfragen, Webkontext ist impliziert.
//Dies wird verwendet, um zu bestimmen, wie der Benutzer mit der API verbunden ist
this.client = (req.headers) ? (req.headers["x-client"] || (req.client || "web")) : "web";
}
}