Express.js: Routenmodellbindung | Komentor

Ich benutze express.js schon eine Weile, aber bis neulich war mir die Raffinesse nicht bewusst router.param Methode. Es ermöglicht Ihnen, einen Rückruf auszuführen, wenn ein bestimmter Parameter in der Route vorhanden ist.

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

Dies ist eine ziemlich nützliche Funktion, da Sie häufig einen Router haben, der ständig ein Modell aus einer Datenbank für weitere Aktionen abruft. Wenn nichts anderes, bereinigt es den Code wirklich.

Aber was wäre, wenn wir mit dieser Funktion ein bisschen kreativ werden würden? Als erstes kam mir in den Sinn, eine Art „verbindlichen Registrierungsprozess“ zu haben und dann Parameter dynamisch über die App zu binden. Bei einem Framework wie Laravel (übrigens Laravel unterstützt RMB und war die Inspiration für diesen Beitrag – Ehre wem Ehre gebührt) gibt es bestimmte Konventionen über Modelle und deren Standort. Wir verlassen uns auf Konfiguration statt Konvention und spezifizieren Modellabruffunktionen.

Das Endergebnis sieht in etwa so aus:

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

Wenn Sie dies lokal ausführen, navigieren Sie zu in Ihrem Browser und sehen Sie sich das Ergebnis an.

Similar Posts

Leave a Reply

Your email address will not be published.