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);

Если вы выполняете это локально, перейдите к в браузере и проверьте результат.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *