2012-01-19 17 views
24

İstemcileri herhangi bir html ve json için tek bir işlevde yakalamak için express.js içinde bir yol biliyor mu?, bir işlevde hem json hem de html için istekleri yakalamanın herhangi bir yolu var mı?

Temelde, hem /users hem de /users.json için tek bir rota istiyorum - raylar, denetimleriyle birlikte çalışır.

Bu sayede mantığı tek bir işlevde kapsülleyebilir ve html veya json oluşturmaya karar verebilirim.

şey gibi:

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

belki bir param kullanabilir misiniz?

+0

2 yol yapma hakkında ne dersiniz? – clyfe

+3

Neden içerik müzakeresi olan bir rota değil? (Zoidberg'in sesinden bahsetti.) –

+0

ekspres yazarının içerik müzakeresini kullanmanızı önerir: https://github.com/visionmedia/express/issues/1340 –

cevap

19

bir rota basittir manuel söylediği gibi böyle bir şey yapmak, böylece, içten bir RegExp üzere derlenen bir dize:

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

kontrol daha burada: http://expressjs.com/guide.html#routing

+5

ah sağ - cevabı hızlı kılavuzda buldu. app.get ('/ users.:format?', işlev (req, res) {if (req.params.format == 'json') res.send (JSON.stringify (...)); else res. render (...); // yeşim şablonu}); – justinjmoses

+0

Sadece aynı anda buldum - ama cevabı takdir ediyorum. – justinjmoses

+1

, benim gibi bu sorunla karşılaşırsa, rotanızın /users.:format olarak tanımlandığından emin olun. ve değil/kullanıcılar: format? Kullanıcıları users.json ile ayırt etmek istiyorsanız. kullanıcı/json belirtmeniz gerekecek. – emilebaizel

49

Ben res.format() inanıyorum

Bu Kabul başlığında dayanır
res.format({ 
    text: function(){ 
    res.send('hey'); 
    }, 

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

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

Ancak kendinizi kullanarak bu başlığı gizleyin edebilirsiniz: Hızlı 3.x bunu yapmanın yolu ve 4.x olduğunu özel katman yazılım veya connect-acceptoverride gibi bir şey. Özel bir katman

bir örnek olabilir:

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

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

    next(); 
}); 
+0

bu çalışır, ancak istemcinin Accept üstbilgisini ayarlamasını gerektirir. Yukarıdaki yorumlarda bahsettiği gibi işlemek için çok daha basit. – emilebaizel

+0

@emilebaizel: Son düzenlememdeki yorumunuza yanıt verdi. :) – Beau

+0

kaygan ara katman! – emilebaizel

0

Yukarıda cevapları ile mutlu değildi. İşte bunun yerine yaptım. Size yardımcı olursa lütfen oy verin.

Tüm json isteklerinin Content-Type üstbilgisinin 'application/json' olarak ayarlandığından emin oluyorum.

if (req.header('Content-Type') == 'application/json') { 
    return res.json({ users: users }); 
} else { 
    return res.render('users-index', { users: users }); 
} 
İlgili konular