2016-04-20 6 views
3

Ich schreibe eine Express-Anwendung, die ich mit der AirBnB eslint configuration linting bin. Diese Konfiguration bietet eine no-params-reassign Prüfung, die die Neuzuordnung von Parametern und Mitgliedern dieser Parameter als Fehler kennzeichnet. Ich persönlich mag das, aber ich bin mir nicht sicher, ob es eine Möglichkeit gibt, req und res in Express zu ändern, ohne die Funktionsparameter zu verändern.Ändern Res ohne muting Argument

Zum Beispiel möchte ich einen Teil der Anforderung in einer Middleware neu zu schreiben:

app.use((req, res, next) => { 
    req.url = req.url.replace("regex", "replacement"); 
}); 

Dies setzt einen Fussel Fehler aus. Ich weiß, ich kann der Fehler diese weggehen, indem Sie:

app.use((_req, res, next) => { 
    req = _req; 
    req.url = req.url.replace("regex", "replacement"); 
}); 

... aber das scheint ein bisschen dumm Lösung. Gibt es eine Möglichkeit, die req und res Variablen für zukünftige Middleware-Aufrufe in Express zu ersetzen, oder ist die einzige Möglichkeit, Änderungen zu erhalten, um sie tatsächlich zu mutieren?

Ich weiß, ich kann nur die no-params-reassign Regel außer Kraft setzen, aber ich wollte sehen, ob es für mich möglich ist, dies zu erreichen, ohne dies zu tun. Vielen Dank!

+2

Kurze Antwort? Ja, die allgemeine Regel besteht darin, 'req' und' res' zu ändern, wenn sie von Ihrer Middleware verwendet werden. Der offizielle Guide schlägt sogar vor, es so zu machen (http://expressjs.com/en/guide/writing-middleware.html). Es mag einen Weg geben, aber ich habe noch nie einen gesehen. Ist 'req.replacedUrl = req.url.replace (" regex "," ersatz ");' make 'eslint' warning? – dvlsg

+1

Ja - das Dogma ist, die Parameter nicht zu mutieren. Guess Express ist möglicherweise damit nicht kompatibel? –

+1

Ich könnte definitiv falsch sein, aber es scheint der empfohlene Weg, um es mit Express zu tun. Und die meisten Nodejs http/Server-Bibliotheken, die Wahrheit gesagt werden. Ich denke, die Idee ist, dass Middleware typischerweise verwendet wird, um die Request/Response-Objekte mit den benötigten Teilen zu "erweitern". Wohl oder übel. – dvlsg

Antwort

0

Gibt es ein Mittel, um die req und res Variablen für zukünftige Middleware Anrufungen in Express ersetzen:

Verwenden Sie das app Objekt als persistenter Speicher beim ersten Aufruf, dann überprüfen Sie auf nachfolgenden Aufrufen

app.use((req, res, next) => { 
    app.req = app.req || req; 
    app.req.url = app.req.url.replace("regex", "replacement"); 
}); 

JSON.stringify und JSON.parse kann verwendet werden, Mutation zu vermeiden:

app.use((req, res, next) => { 
    app.req = app.req || JSON.parse(JSON.stringify(req)); 
    app.req.url = app.req.url.replace("regex", "replacement"); 
}); 

Referenzen

Verwandte Themen