Một kỹ thuật hay mà tôi đã bắt đầu sử dụng với một số ứng dụng của mình trên express là tạo một đối tượng hợp nhất truy vấn, thông số và trường cơ thể của đối tượng yêu cầu của 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;
Sau đó, trong phần thân bộ điều khiển của bạn hoặc bất kỳ nơi nào khác trong phạm vi của chuỗi yêu cầu cấp tốc, bạn có thể sử dụng một cái gì đó như dưới đây:
//./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);
});
Điều này làm cho nó tốt và tiện dụng khi chỉ "đào sâu" vào tất cả "dữ liệu tùy chỉnh" mà người dùng có thể đã gửi theo yêu cầu của họ.
Ghi chú
Tại sao trường 'đạo cụ'? Vì đó là đoạn trích, tôi sử dụng kỹ thuật này trong một số API của mình, tôi cũng lưu trữ dữ liệu xác thực / ủy quyền vào đối tượng này, ví dụ bên dưới.
/*
* @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";
}
}