2012-01-19 3 views
24

express.jsの方法を知っている人は、htmlとjsonの両方の単一の機能でリクエストをキャプチャできますか?は、jsonとhtmlの両方の要求を1つの関数で取得する方法はありますか?

本質的には、レールのようなレールはコントローラのように/users/users.jsonのような単一のルートが必要です。

こうすれば、ロジックを1つの関数にカプセル化し、htmlまたはjsonのどちらかをレンダリングすることができます。

のような何か:

app.get('/users[.json]', function(req, res, next, json){ 
    if (json) 
    res.send(JSON.stringfy(...)); 
    else 
    res.render(...); //jade template 
}); 

は、私は多分のparamを使用してもらえますか?もっとここに

app.get("https://stackoverflow.com/users/:format?", function(req, res, next){ 
    if (req.params.format) { res.json(...); } 
    else { 
    res.render(...); //jade template 
    } 
}); 

がチェック:http://expressjs.com/guide.html#routing

+0

2ルートの作成はどうですか? – clyfe

+3

なぜコンテンツネゴシエーションのあるルートはありませんか? (ゾイドベルクの声による) –

+0

エクスプローラーの作者は、コンテンツネゴシエーションを使用することを推奨しています。https://github.com/visionmedia/express/issues/1340 –

答えて

19

ルートは、あなたがこのような何かを行うことができますので、内部で正規表現にコンパイルされた文字列に簡単ですエクスプレス3.xおよび4.xでこれを行う方法です:

res.format({ 
    text: function(){ 
    res.send('hey'); 
    }, 

    html: function(){ 
    res.send('<strong>hey</strong>'); 
    }, 

    json: function(){ 
    res.send({ message: 'hey' }); 
    } 
}); 

これは、Acceptヘッダーに依存している、しかし、あなたが使用して、このヘッダを自分のmungeすることができますカスタムミドルウェアまたはconnect-acceptoverrideのようなものです。カスタムミドルウェアの

一つの例は次のようになります。

app.use(function (req, res, next) { 
    var format = req.param('format'); 

    if (format) { 
    req.headers.accept = 'application/' + format; 
    } 

    next(); 
}); 
+5

ああ - エクスプレスガイドの答えが見つかりました。 res.end(JSON.stringify(...));そうでなければ、res.get( '/ users.:format?'、function(req、res){if(req.params.format == 'json'レンダリング(...); // jadeテンプレート}); – justinjmoses

+0

私はちょうど同時にそれを見つけました - しかし、応答を感謝します。 – justinjmoses

+1

私のように誰もがこの問題に遭遇する場合は、ルートが/users.:formatとして定義されていることを確認してください。/usersではない:format?ユーザーvs users.jsonを区別したい場合。あなたはユーザー/ jsonを指定する必要があります。 – emilebaizel

49

私はres.format()信じているマニュアルが言うように

+0

これは機能しますが、クライアントはAcceptヘッダーを設定する必要があります。彼が上のコメントで言及するようにそれを扱うためにはるかに簡単です。 – emilebaizel

+0

@emilebaizel:最近の編集であなたのコメントに反応しました。 :) – Beau

+0

滑らかなミドルウェア! – emilebaizel

0

私は上記の答えと幸せではなかったです。代わりに私がしたことがここにあります。それがあなたに役立つなら、投票してください。

すべてのjsonリクエストのContent-Typeヘッダーが 'application/json'に設定されていることを確認します。

if (req.header('Content-Type') == 'application/json') { 
    return res.json({ users: users }); 
} else { 
    return res.render('users-index', { users: users }); 
} 
関連する問題