7

Express で Node.js を使用して既存の Web サイトを書き直す作業を行っています。

サイトのフロントエンドは Backbone JS を使用するため、必要なすべてのルートをネイティブの Backbone 同期に準拠させる必要があります。これで、ほとんどの URL がクライアントとバックボーン同期用に同じになります。ただし、JSON を返す必要があるため、通常の GET では機能しません。

したがって、バックボーンのモデル/コレクションの URL に拡張機能を追加することをお勧めします.json

app.get('/p/:topCategory/:category/:product.:format', function(req, res) { ... });

if (req.params.id == 'json')JSON を送信する以外に、HTML をレンダリングする場所はどこですか?

または、より良いアプローチがありますか?助けてください。

4

4 に答える 4

12

これを行うためのより良い方法は、Express3.xのコンテンツネゴシエーション機能を使用することですres.format

https://github.com/visionmedia/express/blob/master/lib/response.js#L299-378

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

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

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

アプローチも大丈夫です、元はYammerです。同じアプローチを使用しています:http://developer.yammer.com/api/#message-viewing

于 2012-06-09T09:42:22.667 に答える
6

Acceptリクエストでヘッダーを使用しますAccept: application/json。JSON を受信したいAccept: text/HTML場合、HTML が必要な場合。

于 2012-06-09T03:18:43.907 に答える
2

「X-Requested-With」ヘッダーがjQueryなどに設定されていることも確認する代替手段。

var onlyAllowJsonRequests = function (req, res, next) {

    var acceptJson = (req.accepted.length && _.any(req.accepted, function (acc) { return acc.value.indexOf("json") !== -1 }));

    // also check that "X-Requested-With": "XMLHttpRequest" header is set
    if (acceptJson && (req.xhr === true)) {
        next();
    } else {
        res.send(406, "Not Acceptable");
    }
};

app.use(onlyAllowJsonRequests);

NB アンダースコアは依存関係です。

于 2012-12-07T12:11:37.910 に答える