Cách thích hợp để đặt trạng thái phản hồi và nội dung JSON trong API REST được tạo bằng nodejs và express


186

Tôi đang chơi xung quanh với Nodejs và thể hiện bằng cách xây dựng một API nghỉ ngơi nhỏ. Câu hỏi của tôi là, cách tốt nhất / cách tốt nhất để đặt trạng thái mã, cũng như dữ liệu phản hồi là gì?

Hãy để tôi giải thích với một ít mã (Tôi sẽ không đặt nút và mã nhanh cần thiết để khởi động máy chủ, chỉ các phương thức bộ định tuyến có liên quan):

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];
  }
};

Mã dưới đây hoạt động hoàn hảo và khi gửi yêu cầu với Postman, tôi nhận được kết quả sau: nhập mô tả hình ảnh ở đây

Như bạn có thể thấy, trạng thái hiển thị 200, không sao cả. Nhưng đây có phải là cách tốt nhất để làm điều này? Có trường hợp nào tôi phải tự đặt trạng thái, cũng như JSON được trả lại không? Hay là luôn luôn được xử lý bằng cách thể hiện?

Ví dụ, tôi vừa thực hiện một thử nghiệm nhanh và sửa đổi một chút phương thức get ở trên:

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);
});

Như bạn có thể thấy, nếu không tìm thấy người dùng trong mảng, tôi sẽ chỉ đặt trạng thái 404.

Tài nguyên / lời khuyên để tìm hiểu thêm về chủ đề này được chào đón nhiều hơn.


3
Đây là câu trả lời được đánh giá cao nhất của tôi và nó không được chấp nhận :( @dukable, tôi biết đã lâu rồi, nhưng nó có giải quyết được vấn đề của bạn không?
Michał Dudak

@ MichałDudak: Có, câu trả lời của bạn nên được chấp nhận. Nhưng người dùng dukable này không hoạt động kể từ ngày 15 tháng 8 năm 2015 (kể từ ngày 31 tháng 7 năm 2017). +1 cho câu trả lời của bạn dù sao đi nữa;)
Amol M Kulkarni

Câu trả lời:


230

Tham chiếu API Express bao gồm trường hợp này.

Xem trạng tháigửi .

Nói tóm lại, bạn chỉ cần gọi statusphương thức trước khi gọi jsonhoặc send:

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

32
Nếu bạn chỉ muốn gửi mã trạng thái (không có dữ liệu), phương thức sẽ làres.sendStatus(400);
internet-nico

3
Điều này dường như không còn hoạt động nữa. Phản hồi được gửi với mã trạng thái chính xác, nhưng không có nội dung nào ....
LondonRob

2
Bỏ qua bình luận cuối cùng của tôi. Nếu bạn đặt trạng thái thành 204 (Không có nội dung) thì nó sẽ không gửi phần thân.
LondonRob

2
@ internet-nico cũng res.sendStatus(400);gửi dữ liệu chuỗi, tương đương vớires.status(400).send('Not Found')
Davide

74

Bạn có thể làm theo cách này:

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

Điều này sẽ đặt mã trạng thái HTTP thành 400, nó hoạt động ngay cả trong express 4.


17
express deprecated res.json(status, obj): Use res.status(status).json(obj) instead Vì vậy, res.status(400).json(json_response)sẽ là chính xác ngày nay.
Will Luce

Vâng, cảm ơn ... nó được đánh dấu là không dùng nữa, nhưng vẫn hoạt động: P Nhận xét của bạn là hợp lệ, điểm tốt.
mzalazar


41

tình trạng của 200 sẽ là mặc định khi sử dụng res.send, res.jsonvv

Bạn có thể đặt trạng thái như res.status(500).json({ error: 'something is wrong' });

Thường thì tôi sẽ làm một cái gì đó như ...

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

Sau đó, có phần mềm trung gian lỗi của tôi gửi phản hồi và làm bất cứ điều gì khác tôi cần làm khi có lỗi.

Ngoài ra: res.sendStatus(status) đã được thêm vào kể từ phiên bản 4.9.0 http://expressjs.com/4x/api.html#res.sendStatus


23

Một danh sách về mã trạng thái HTTP

Cách thực hành tốt về phản hồi trạng thái là, dự đoán, gửi mã trạng thái HTTP phù hợp tùy thuộc vào lỗi (4xx cho lỗi máy khách, 5xx cho lỗi máy chủ), liên quan đến phản hồi JSON thực tế không có "kinh thánh" nhưng ý tưởng tốt có thể là để gửi (một lần nữa) trạng thái và dữ liệu dưới dạng 2 thuộc tính khác nhau của đối tượng gốc trong một phản hồi thành công (theo cách này bạn đang cho khách hàng cơ hội nắm bắt trạng thái từ các tiêu đề HTTP chính tải trọng) và thuộc tính thứ 3 giải thích lỗi theo cách dễ hiểu của con người trong trường hợp có lỗi.

SọcAPI hoạt động tương tự trong thế giới thực.

I E

đồng ý

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

lỗi

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

13

Tôi đang sử dụng điều này trong ứng dụng Express.js của mình:

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

5

Cách tiêu chuẩn để nhận được đầy đủ httpResponse bao gồm các thuộc tính sau

  1. body // chứa dữ liệu của bạn
  2. tiêu đề
  3. đồng ý
  4. trạng thái
  5. trạng thái
  6. kiểu
  7. url

Trên backend , làm được điều này

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')
})

Trên Frontend, ví dụ: Angularchỉ cần làm:

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

Bạn có thể làm điều này

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

0

Cách tốt nhất để gửi phản hồi lỗi sẽ là return res.status(400).send({ message: 'An error has occurred' }).

Sau đó, ở lối vào của bạn, bạn có thể bắt nó bằng cách sử dụng một cái gì đó như thế này:

        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 })
        })

Chỉ cần đăng nhập errsẽ không hoạt động, vì đối tượng tin nhắn đã gửi của bạn cư trú err.response.data.

Mong rằng sẽ giúp!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.