2017-12-30 37 views
0

Ich möchte Anfrage Parameter in Middleware-Funktion in Expressjs Rahmen zu behandeln. Um mein Problem zu beschreiben, habe ich ein sehr kleines Arbeitsbeispiel erstellt. Nehmen wir an, ich möchte einen Sprachparameter im Pfad haben und seinen Wert auf den Standardwert ändern, wenn der angegebene Wert falsch ist (nicht unterstützte Sprache). Nehmen wir an, ich unterstütze ‚en‘ und ‚fi‘ nur Sprachen und ich möchte die „lang“ Parameter ‚fi‘ gegeben, wenn der Benutzer etwas setzen anders als [ ‚en‘, ‚fi‘ ].Wie man req Parameter in Middleware Funktion behandelt

tun, dass ich ein unten Stück Code vorbereitet:

const express = require('express'); 
const app = express(); 

// MIDDLEWARE FUNTION 
function handleLang(req, res, next) { 
    console.log("from handleLang I see params: "); console.log(req.params) 
    var supportedLangs = ['en', 'fi'] 
    if (req.params.lang === undefined || (supportedLangs.indexOf(req.params.lang) == -1)) { 
     console.log("so changing req.params.lang to default...") 
     req.params.lang = "fi" 
     console.log("before I leave handleLang I see req.params as: "); console.log(req.params) 
    } 
    return next() 
} 

app.use("/:lang*?", handleLang) 

app.get('/:lang*?', function (req, res) { 
    console.log('from app.get I see following params: '); console.log(req.params) 
    res.send('index') 
}) 

app.listen(4000,() => { 
    console.log('Server started....') 
}) 

ich erwartet, dass die die handleLang Funktion wird die lang ändern auf den Standardwert und ich werde das in get-Funktion sehen. Leider habe ich mich geirrt.

Wenn ich http://localhost:4000/xx zu adressieren, sehe ich folgende Ausgabe:

Server started.... 
from handleLang I see params: 
{ '0': '', lang: 'xx' } 
so changing req.params.lang to default... 
before I leave handleLang I see req.params as: 
{ '0': '', lang: 'fi' } 
from app.get I see following params: 
{ '0': '', lang: 'xx' } 
from handleLang I see params: 
{ '0': '', lang: 'favicon.ico' } 
so changing req.params.lang to default... 
before I leave handleLang I see req.params as: 
{ '0': '', lang: 'fi' } 
from app.get I see following params: 
{ '0': '', lang: 'favicon.ico' } 

Ich habe keine Ahnung, warum irgendwie req.params.lang zu ‚favicon.ico‘ ändert und ich verstehe nicht, warum Ich sehe dieselbe Nachricht zweimal. Kann mir jemand erklären, warum es passiert und beschreiben, wie es richtig gemacht werden sollte?

Antwort

1

Ein Ansatz kann sein, dass Sie die Sprache innerhalb Middleware wie unten einstellen:

`req.headers['language'] = 'fi';` 

Sie können später diesen Wert wie unten Zugang:

console.log(req.headers['language'])

+0

danke, das funktioniert, aber hast du eine ahnung wenn ich es irgendwie in req.params stecken kann? – nosbor

+0

Wir können auch einen Weg innerhalb des Problems beschrieben: https://github.com/expressjs/express/issues/2911 –

+0

@nosbor sowieso, bitte beachten Sie, dass dies definitiv die Sprache Header überschreiben würde, wenn es vom Client übergeben wird . Es wäre ein kleiner Prozentsatz, aber das würde definitiv den Header überschreiben, wenn er für etwas anderes als den aktuellen Zweck verwendet würde. – cramopy

1

Dies wird durch den Browser verursacht wird Sie könnten verwenden.

Viele Browser (z. B. Chrome und Firefox) versuchen automatisch, die Datei favicon.ico zu erhalten, wenn sie nicht angegeben wird. Dies ist die Datei, in der das Symbol für Ihre Website gespeichert wird.

Die meisten Websites im Internet verwenden diesen Dateinamen und Speicherort (im Stammverzeichnis), was dazu führt, dass die meisten Browser die Datei automatisch von dort abrufen, wenn nicht ausdrücklich angegeben. Ich persönlich denke, dass dies ein undefinierter Standard ist, den die meisten Leute benutzen.

Was tatsächlich geschieht, ist dies:

  1. Sie geben http://localhost:4000/xx an die Browser-Bar Adresse, die auf die Anfrage leades Sie eigentlich wollten.

  2. Ihr Browser möchte das Symbol der Website, die Sie besuchen, anzeigen und es wird der Cache dafür überprüft. Da Sie kein Websitensymbol haben, versucht der Browser, das Symbol innerhalb einer neuen Anfrage abzurufen. Da Sie den Speicherort für die Website ico nicht explizit festgelegt haben, versucht der Browser automatisch, ihn von http://localhost:4000/favion.ico zu erhalten, der von express als Ihr lang Parameter parsiert wird.

Als Ergebnis sehen Sie Ihre aktuelle Anfrage http://localhost:4000/xx und die Anfrage automatisch http://localhost:4000/xx von Ihrem Browser ausgegeben.Aus diesem Grund ist der Sprachparameter für die letzte Anforderung auf favicon.ico eingestellt.

+0

Vielen Dank für die Erklärung, irgendeine Idee, ob es eine gute Lösung für das obige Problem gibt (Ersetzen des Wertes der Variable in req.params)? – nosbor

+0

@nosbor um ehrlich zu sein, ich weiß nicht die Antwort für Ihre zweite Frage. Ich kannte den Teil mit den zwei Anfragen (und Favicon), also habe ich technisch deine Anfangsfrage beantwortet. – cramopy

Verwandte Themen