2013-04-18 17 views
7

を使用して、静的ファイルとapp.get競合をサーブ。 app.use(express.static(__dirname + '/public'))行をコメントアウトすると、コールバックが機能します。私は注文を変更しようとしましたが、その宝くじのように!私はここで間違っていることを知ることを好むだろう。は、私がここでのコードのこの部分を持っているExpress.js

これは、ミドルウェアの呼び出し方法に関する自分の知識の欠如と関係があります。誰かがこの問題を理解するのを助けることができますか?

基本的には、ファイルが提供され、index.htmlがブラウザにロードされる前にロジックを実行したいだけです。ところで、app.use(express.static())行の前にapp.get()を置くことによって、そのトリックはしませんでした!

+1

public/index.htmlファイルがありますか? –

+0

はい私は..... – limoragni

+2

それはそれが壊れている理由です。それを取り除くとすべてが機能します。フォルダのインデックスを無効にする "dir"のようなオプションがあるかもしれませんが、わかりません。 –

答えて

5

まず、静的ファイルミドルウェアが優先されます。

app.use(express.static(__dirname + '/public')); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({secret: 'secret'})); 

また、app.routerの用途も追加する必要があります。

app.use(express.static(__dirname + '/public')); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({secret: 'secret'})); 
app.use(app.router); 

ミドルウェアは、リクエストごとに順番に処理されます。したがって、静的ファイルにindex.htmlがある場合、yourdomain.com/の要求は、静的ファイルハンドラによって処理されるため、app.routerにはなりません。 index.htmlを削除し、そのリクエストはapp.routerに流れます。

+0

お返事ありがとうございます。しかし、app.routerを使用してmddlewareをその順序で使用すると、ファイルは配信されません。 app.get()内のコードがトリガされます。 app.get()内でファイルの提供とコードの両方を実行したい。 – limoragni

+0

静的ミドルウェアは、その上にあるすべてのミドルウェアを必要としないため、常に先頭にする必要があります。たとえば、クッキーの解析、セッションの設定、または静的資産のユーザー認証はかなり愚かです。 –

+0

オクラホマ...それを得る。私は静的ファイルを正しく使用していません。私はそれを実現し始めた。私はthink.html index.htmlファイルを削除し、そのファイルをサーバー側からレンダリングしています。それは正しい方法ですか? – limoragni

3

index.htmlファイルの名前を変更してください。

1)彼らが優先されるように、静的なミドルウェア前)app.routerを使用して、おそらく(あなたapp.get('/')ルートをマウントします。これは、単純な

app.use(express.static(__dirname + '/public')); 

app.get('/', function(req, res){ 
    if(req.session){ 
     console.log(req.session); 
    } 
    console.log('ok'); 
    res.sendfile(new_index_file); 
}); 
0

は、私はあなたがここに3つのオプションを持っている、と考えているということです。最初にマウントされたミドルウェアは、最初に一致する要求を処理します。

2)静がexample.com/static/...

3から提供されるように、app.use('/static', express.static('public'));のような静的なパスのパスプレフィックスを使用)は、スマート行動と脚で自分を撮影したいですか? :)異なる状況で同じURLから2つの異なるコンテンツタイプを提供するために、人々はAcceptヘッダーとコンテンツネゴシエーションを使用することがあります。要求のAcceptヘッダーに適切なタイプが必要な場合にのみ、Acceptヘッダーと処理要求で特定のコンテンツタイプの静的ミドルウェアを確認できます。それ以外の場合は、ストリームを処理して/ビューに渡します。静的ミドルウェアのコンテンツネゴシエーションは、req.acceptsでカスタマイズできます。

関連する問題