Express.js: привязка модели маршрута | Кодементор
Я использую express.js некоторое время, но до вчерашнего дня я не знал о изящном router.param
метод. Это позволяет вам выполнить обратный вызов, если в маршруте присутствует определенный параметр.
const express = require("express");
const app = express();
const router = express.Router();
route.param('user', function(req, res, next) {
const user = { id: 1, name: 'Mirko' };
req.user = user;
next();
});
router.get("/:user", function(req, res) {
return res.json({ result: req.user });
});
app.use("/api/users", router); app.listen(3000);
Это довольно полезная функция, потому что часто у вас будет маршрутизатор, который постоянно извлекает модель из базы данных для дальнейших действий. Если ничего другого, это действительно очищает код.
Но что, если бы мы подошли к этой функции немного творчески. Первое, что пришло мне в голову, это иметь какой-то «процесс регистрации привязки», а затем динамически привязывать параметры в приложении. С таким фреймворком, как Laravel (кстати, Laravel поддерживает юаней и послужил источником вдохновения для этого поста — отметим, где следует отдать должное), существуют определенные соглашения о моделях и их расположении. Мы будем полагаться на конфигурацию, а не на соглашение, и укажем функции выборки модели.
Конечный результат выглядит примерно так:
const express = require("express");
const app = express();
const assert = require("assert");
const router = express.Router();
function getUser(id) {
return Promise.resolve({ id: 1, name: "Mirko" });
}
function getPost(id) {
return Promise.resolve({ id: 1, title: "Express.js is cool" });
}
const bindings = [
{ param: "user", handler: getUser },
{ param: "post", handler: getPost }
];
function handleParam({ param, handler }) {
assert(param, "Binding mush have a param");
assert(handler, "Binding must have a handler");
return function(req, res, next, id) {
return handler(id)
.then(model => {
req[param] = model;
next();
})
.catch(err => {
next(err);
});
};
}
bindings.forEach(function(binding) {
router.param(binding.param, handleParam(binding));
});
router.get("/:user/posts/:post", function(req, res) {
return res.json({ user: req.user, post: req.post });
});
router.get("/:user", function(req, res) {
return res.json({ result: req.user });
});
app.use("/api/users", router);
app.listen(3000);
Если вы выполняете это локально, перейдите к в браузере и проверьте результат.