2016-07-15 4 views
1
const app = express(); 
var router = require('express').Router({mergeParams: true}); 
const payloadMiddleware = (req, resp, next) => { 
    console.log('A:',req.params); 
    const {params, query} = req; 
    const payload = req.body; 
    req.my_params = { params, query, payload }; 
    next(); 
}; 

router.use(payloadMiddleware); 

router.get('/inventory/:itemID/price', async function GetPrice(req, res, next) { 
    console.log('B', req.my_params); 
    console.log('C', req.params); 
} 

app.use(bodyParser.urlencoded({extended: true})); 
app.use(bodyParser.json()); 
app.use('/', router); 
server = app.listen(port); 

GET /inventory/abc/price?a=1&b=2 ergibtLeere params Objekt in Express.js Middleware

A: {} # unclear why this is empty 
B: { params: {}, 
    query: { a: '1', b: '2' }, 
    payload: {} } 
C: {itemID: 'abc'} 

So verwirrt bin ich: Ich meine Middleware erwarten, dass das neue Objekt finden params in req, konstruieren und weisen es req als my_params, dann übergeben Sie das an den Inventory-Handler. Und dies geschieht teilweise, indem der Querystring geparst und dann in meiner Middleware zugewiesen wird. Warum ist req.params === {} in meiner Middleware-Funktion, aber req.params = {itemID: 'abc'} im GET-Handler selbst?

Es gibt keine andere Routen mit dem gleichen Muster, keine andere Middleware ...

auch keine Änderung beobachtet wird, wenn ich die Optionen Objekt aus der zweiten Zeile zu entfernen, dh var router = require('express').Router();

Antwort

4

payloadMiddleware ein Generikum ist Middleware, die nicht für ein bestimmtes URL-Muster deklariert ist, das Parameter enthält (es entspricht einer beliebigen Anfrage).

Express weiß auch nicht, dass Anforderungen, die an die Middleware übergeben werden, schließlich im Handler für /inventory/:itemID/price enden.

Wenn Sie die Middleware wollen die Parameter erhalten, müssen Sie gezielt gegen Routen verwenden, die mit einem Muster übereinstimmen:

app.use('/inventory/:itemID/price', payloadMiddleware); 

Oder als Teil der Route-Handler:

router.get('/inventory/:itemID/price', payloadMiddleware, async function ...); 
+0

Ich hatte Basierend auf meinem Verständnis des Standard-Einhängepunkts aus der Express-Dokumentation: "Verwendet die angegebene Middleware-Funktion oder -Funktionen mit optionalem Pfadpfad, der standardmäßig auf"/"gesetzt ist." Also werden die Parameter nur gesetzt, wenn die Middleware speziell auf einem bestimmten Pfad verwendet wird? Es gibt keine Möglichkeit zu spezifizieren, dass ich möchte, dass diese Middleware verwendet wird und die Pfadparameter für JEDE Anfrage haben? – Ben

+0

@Ben nein, das ist nicht möglich, vor allem weil eine Middleware, wenn sie eigenständig verwendet wird, keine anderen Middleware- oder Routen-Handler kennt. Even Express wird vorher nicht wissen, ob eine Anfrage zu einem bestimmten parametrisierten Routenmuster führt, so dass es 'req.params' vorher nicht erzeugen kann (auch aus dem einfachen Grund, dass Sie zahlreiche parametrisierte Routen haben, also ohne zu wissen wo Eine Anfrage wird enden, es wird nicht wissen, welche Route Parameter zu parsen). – robertklep

Verwandte Themen