Düğüm ve ekspres ile yapılan bir REST API'sinde yanıt durumunu ve JSON içeriğini ayarlamanın uygun yolu


187

Ben küçük bir dinlenme API inşa ederek Nodejs ve ekspres ile uğraşıyorum. Benim sorum, yanı sıra kod durumunu ayarlamak için iyi bir uygulama / en iyi yolu nedir?

Biraz kodla açıklamama izin verin (sunucuyu başlatmak için gerekli olan düğümü ve ekspres kodu koymayacağım, sadece ilgili yönlendirici yöntemleri):

router.get('/users/:id', function(req, res, next) {
  var user = users.getUserById(req.params.id);
  res.json(user);
});


exports.getUserById = function(id) {
  for (var i = 0; i < users.length; i++) {
    if (users[i].id == id) return users[i];
  }
};

Aşağıdaki kod mükemmel çalışıyor ve Postacı ile bir istek gönderirken aşağıdaki sonucu alıyorum: resim açıklamasını buraya girin

Gördüğünüz gibi, durum 200 gösteriyor, ki bu tamam. Ama bunu yapmanın en iyi yolu bu mu? Durumun yanı sıra döndürülen JSON'u kendim ayarlamam gereken bir durum var mı? Yoksa bu her zaman ekspres tarafından mı ele alınır?

Örneğin, hızlı bir test yaptım ve yukarıdaki get yöntemini biraz değiştirdim:

router.get('/users/:id', function(req, res, next) {
  var user = users.getUserById(req.params.id);
  if (user == null || user == 'undefined') {
    res.status(404);
  }
  res.json(user);
});

Gördüğünüz gibi, kullanıcı dizide bulunmazsa, sadece 404 durumunu ayarlayacağım.

Bu konu hakkında daha fazla bilgi edinmek için kaynaklar / tavsiyeler hoş geldiniz değildir.


3
Bu benim en yüksek puan alan yanıtım ve kabul edilmedi :( @dukable, bir süredir olduğunu biliyorum, ama sorununuzu çözdü mü?
Michał Dudak

@ MichałDudak: Evet, cevabınız kabul edilmiş olmalı. Ancak bu dukable kullanıcı 15 Ekim 2015'ten beri aktif değil (31 Temmuz 2017'de olduğu gibi). Yine de cevabınız için +1;)
Amol M Kulkarni

Yanıtlar:


230

Express API referansı bu durumu kapsar.

Durumu görün ve gönderin .

Kısacası, sadece aramak zorunda statusçağırmadan önce yöntemini jsonveya send:

res.status(500).send({ error: "boo:(" });

32
Yalnızca bir durum kodu göndermek istiyorsanız (veri yok), yöntem şu olurdures.sendStatus(400);
internet-nico

3
Bu artık işe yaramıyor gibi görünüyor. Yanıt doğru durum kodu ile gönderiliyor, ancak gövdesi yok ....
LondonRob

2
Son yorumumu yoksay. Durumu 204 (İçerik yok) olarak ayarlarsanız gövdeyi göndermez.
LondonRob

2
@ internet-nico de res.sendStatus(400);bir dize veri göndermek, eşdeğerres.status(400).send('Not Found')
Davide

74

Bunu şu şekilde yapabilirsiniz:

res.status(400).json(json_response);

Bu, HTTP durum kodunu 400 olarak ayarlayacaktır, ekspres 4'te bile çalışır.


17
express deprecated res.json(status, obj): Use res.status(status).json(obj) instead Yani, res.status(400).json(json_response)bugünlerde doğru olurdu.
Luce Luce

Evet, teşekkürler ... kullanımdan kaldırıldı olarak işaretlenmiş, ancak yine de çalışıyor: P Yorumunuz geçerli, iyi bir nokta.
mzalazar


41

kullanırken 200 statü varsayılan olacaktır res.send, res.jsonvb

Durumu aşağıdaki gibi ayarlayabilirsiniz res.status(500).json({ error: 'something is wrong' });

Genellikle böyle bir şey yapacağım ...

router.get('/something', function(req, res, next) {
  // Some stuff here
  if(err) {
    res.status(500);
    return next(err);
  }
  // More stuff here
});

Sonra benim hata middleware yanıt göndermek ve bir hata olduğunda yapmam gereken başka bir şey var.

Ayrıca: 4.9.0res.sendStatus(status) sürümünden beri eklendi http://expressjs.com/4x/api.html#res.sendStatus


23

HTTP Durum Kodlarının listesi

Durum yanıtı ile ilgili iyi uygulama, tahminen, hataya bağlı olarak uygun HTTP durum kodunu göndermektir (istemci hataları için 4xx, sunucu hataları için 5xx), gerçek JSON yanıtı ile ilgili "İncil" yoktur, ancak iyi bir fikir olabilir durumu ve verileri (yine) başarılı bir yanıtla kök nesnenin 2 farklı özelliği olarak göndermek (bu şekilde istemciye durumu HTTP üstbilgilerinden ve yükün kendisinden yakalama şansı verirsiniz ) ve hata durumunda insan tarafından anlaşılabilir bir şekilde hata.

Stripe'in API'sı gerçek dünyada benzer şekilde davranır.

yani

tamam

200, {status: 200, data: [...]}

Hata

400, {status: 400, data: null, message: "You must send foo and bar to baz..."}

13

Bunu Express.js uygulamamda kullanıyorum:

app.get('/', function (req, res) {
    res.status(200).json({
        message: 'Welcome to the project-name api'
    });
});

5

Aşağıdaki özellikleri içeren tam HttpResponse almanın standart yolu

  1. body // verilerinizi içerir
  2. başlıkları
  3. tamam
  4. durum
  5. statusText
  6. tip
  7. uRL

Açık arka uç Bunu yapmak

router.post('/signup', (req, res, next) => {
    // res object have its own statusMessage property so utilize this
    res.statusText = 'Your have signed-up succesfully'
    return res.status(200).send('You are doing a great job')
})

On Frontend'de örneğin içinde Angular, sadece yap:

let url = `http://example.com/signup`
this.http.post(url, { profile: data }, {
    observe: 'response' // remember to add this, you'll get pure HttpResponse
}).subscribe(response => {
    console.log(response)
})


2
try {
  var data = {foo: "bar"};
  res.json(JSON.stringify(data));
}
catch (e) {
  res.status(500).json(JSON.stringify(e));
}

0

Bunu yapabilirsin

            return res.status(201).json({
                statusCode: req.statusCode,
                method: req.method,
                message: 'Question has been added'
            });

0

Hata yanıtı göndermenin en iyi yolu return res.status(400).send({ message: 'An error has occurred' }).

Ardından, ön ucunuzda böyle bir şey kullanarak yakalayabilirsiniz:

        url: your_url,
        method: 'POST',
        headers: headers,
        data: JSON.stringify(body),
    })
        .then((res) => {
            console.log('success', res);
        })
        .catch((err) => {
            err.response && err.response.data && this.setState({ apiResponse: err.response.data })
        })

errGönderdiğiniz ileti nesnenizde bulunduğu için yalnızca günlük kaydı çalışmaz err.response.data.

Umarım yardımcı olur!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.