2017-12-30 35 views
0

expressjsフレームワークのミドルウェア関数でリクエストパラメータを処理したい。私の問題を説明するために、私は非常に小さな作業例を作成しました。与えられた値が間違っている場合(サポートされていない言語の場合)、パスに言語パラメータを設定し、その値をデフォルトに変更したいとしましょう。 「Fiの」、「EN」[よりも、他のユーザー与えどちらかといえば私は「Fiの」言語(EN)をサポートし、私は「Fiの」「LANG」パラメータを設定したいのは、仮定しましょう]。私は、コードの以下の部分準備したことを行うにはミドルウェア関数のreqパラメータの扱い方

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....') 
}) 

を私はhandleLang機能がデフォルト値にLANGを変更しますと私はget関数でそれを見るだろうと予想しました。残念ながら私は間違っていました。

私はhttp://localhost:4000/xxに対処するために行くとき、私は次の出力を参照してください。

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' } 

を私はreq.params.langは何とか「favicon.icoを」に変わり、私は理由を理解していない理由はわかりません私は同じメッセージを2回見る。誰が私にそれがなぜ起こるのかを説明し、それがいかに正しく行われるべきかを記述することができますか?

答えて

1

一つのアプローチは、あなたが以下のようなミドルウェア内部の言語を設定できるようになります

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

あなたは、後で以下のように、この値にアクセスすることができます。

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

+0

ありがとう、それは動作しますが、私は何とかreq.paramsに入れることができますか? – nosbor

+0

私は、問題の内部にある方法を使用することもできます。https://github.com/expressjs/express/issues/2911 –

+0

@nosborとにかく、クライアントが渡すと言語ヘッダーが上書きされることに注意してください。小さなパーセンテージになりますが、現在の目的以外の目的に使用される場合は、ヘッダーが確実に上書きされます。 – cramopy

1

これは、ブラウザによって引き起こされますあなたが使っているかもしれない。

多くのブラウザ(ChromeやFirefoxなど)では、指定されていないと自動的にfavicon.icoファイルが取得されます。これがあなたのウェブサイトのアイコンが保存されているファイルです。

ウェブ上のほとんどのサイトでは、このファイル名と場所(ルートディレクトリ内)が使用されます。明示的に指定されていない場合、ほとんどのブラウザがファイルを自動的にそこから取得します。私は個人的には、これはほとんどの人が使用する未定義の状態だと思います。実際に何が起こる

はこれです:

  1. あなたが実際に望んでいたリクエストにleadesブラウザのアドレスバーにhttp://localhost:4000/xxを入力します。

  2. あなたのブラウザはあなたが訪れているサイトのアイコンを表示したいと思っており、それがキャッシュをチェックしています。 Webサイトのアイコンがないため、ブラウザは新しい要求内でアイコンを取得しようとします。再度あなたがウェブサイトicoの場所を明示的に設定しなかったので、ブラウザはhttp://localhost:4000/favion.icoから自動的に取得しようとします。これはエクスプレスであなたのlangパラメータとして解析されます。あなたは、実際の要求http://localhost:4000/xxを参照し、自動的にブラウザによって発行されたhttp://localhost:4000/xxを要求した結果

。これは、最後の要求に対して言語パラメータがfavicon.icoに設定されている理由です。

+0

上記の問題(req.paramsの変数の値を置き換える)のための良い解決策があれば、どんな考えでも説明に感謝しますか? – nosbor

+0

@nosbor正直言って、私はあなたの2番目の質問の答えを知らない。私は2つのリクエスト(とファビコン)を持つ部分を知っていたので、技術的に私はあなたの最初の質問に答えました。 – cramopy

関連する問題