Om routing i express

Routing i express

Utöver att använda express för att skicka tillbaka filer (såsom din index.html fil) kan du även skapa router som svarar med data. Du kan välja att skapa router för en specific HTTP metod (POST, GET, PUT, DELETE) eller för alla.

Enkla exempel på routing i express

// POST: /banan
app.post('/banan', function (req, res) {
  res.send('Got a POST request');
});

// GET: /banan
app.get('/banan', function (req, res) {
  res.send('Got a GET request');
});

// PUT: /banan
app.put('/banan', function (req, res) {
  res.send('Got a PUT request');
});

// DELETE: /banan
app.delete('/banan', function (req, res) {
  res.send('Got a DELETE request');
});

// ALL HTTP METHODS: /banan
app.all('/banan', function (req, res) {
  // req.method has the request method 
  res.send('Got a ' + req.method + ' request');
});

Koden ovan låter dig ta emot och svara på ett request. Dock är URL:en för anropet inte särkilt användbar.

Express route parameters

För att göra dina URL:er mer användbara kan du använda route parametrar (på samma sätt som du gör i angular) för att peka ut olika delar av din url som egentligen är data.

GET: /users/me
GET: /users/hugo
GET: /users/thomas

Alla URL:er ovan pekar på olika användare, och vi vill inte behöva skapa en route (app.get()) för varje användare. Istället vill vi peka ut att allt efter den andra slashen (/) är en parameter (data).

// instead of writing
app.get('/users/me', ...);
app.get('/users/hugo', ...);
app.get('/users/thomas', ...);

// we use a route parameter syntax
app.get('/users/:userName', ...);

Denna syntax tillåter oss att ta emot vilket anrop som helst som matchar mönstret ”/users/[something]” och använda en enda funktion för att svara. Frågan är bara, var har min data (”me”, ”hugo”, ”thomas”) tagit vägen?

// using express route params
// getting a single user
app.get('/users/:userName', function(req, res) {
    // all route parameters are avaiable on req.params
    var userName = req.params.userName;
    console.log("GET request for userName:", userName);
    res.json(userName);
});

Route parameters kan även vara valfria, vilket betyder att de inte måste vara med för att din route ska funka.

// optional route parameters are declared with "?"
app.get('/users/:userName?', function(req, res) {
    // all route parameters are avaiable on req.params
    var userName = req.params.userName;
    if (userName) {
        console.log("GET request for userName:", userName);
        res.json(userName);
    } else {
        console.log("GET request without userName");
        res.json(null);
    }
});

Koden ovan betyder att din route nu kan vara antingen ”/users/[something]” eller bara ”/users”.

Skicka och ta emot data i express

För ett givet HTTP anrop kan klienten skicka data till servern som vi kan plocka upp. Beroende på vilken metod som används kan den data finnas på olika ställen.

POST: only sends data in request payload (body)
GET: only sends data in request URL 
PUT: sends data in BOTH request URL and payload
DELETE: only sends data in request URL 

Beroende på vilken typ av HTTP metod så kan du sedan plocka upp denna data med hjälp av req objektet.

// POST can only recieve data in the payload
app.post('/users', function(req, res) {
    // all data recieved in a request
    var allData = {};

    // we can have data in req.body
    allData.body = req.body;

    /*
        Do something with recieved data...
    */

    res.json(allData);
});

// GET can only recieve data in the URL
app.get('/users/:userName', function(req, res) {
    // all data recieved in a request
    var allData = {};

    // if the URL recieved is "/users/me",
    // all we have is express parameters
    allData.params = req.params;

    // if the URL recieved is "/users/me?banana=1&orange=2",
    // we have BOTH express parameters AND query (GET, ?x=y...) parameters (also called query)
    allData.params = req.params;
    allData.query = req.query;

    /*
        Do something with recieved data...
    */

    res.json(allData);
});

// PUT can recieve data in BOTH request URL and payload
app.put('/users/:userName', function(req, res) {
    // all data recieved in a request
    var allData = {};

    // if the URL recieved is "/users/me",
    // all we have is express parameters
    allData.params = req.params;

    // if the URL recieved is "/users/me?banana=1&orange=2",
    // we have BOTH express parameters AND query (GET, ?x=y...) parameters (also called query)
    allData.params = req.params;
    allData.query = req.query;

    // and we have data in req.body
    allData.body = req.body;

    /*
        Do something with recieved data...
    */

    res.json(allData);
});

// DELETE can only recieve data in the URL
app.delete('/users/:userName', function(req, res) {
    // all data recieved in a request
    var allData = {};

    // if the URL recieved is "/users/me",
    // all we have is express parameters
    allData.params = req.params;

    // if the URL recieved is "/users/me?banana=1&orange=2",
    // we have BOTH express parameters AND query (GET, ?x=y...) parameters
    allData.params = req.params;
    allData.query = req.query;

    /*
        Do something with recieved data...
    */

    res.json(allData);
});

Läs mer

0 votes