2014-09-26 8 views
79

setzen Ich bin mit Nodejs herumspielen und durch den Bau einer kleinen Rest API express. Meine Frage ist, was ist der beste Weg, um den Code-Status, sowie die Antwortdaten zu setzen?Richtiger Weg, um Antwort-Status und JSON-Inhalt in einer REST-API mit Nodejs und express

Lassen Sie mich mit ein wenig Code erklären (ich will nicht den Knoten setzen und Express Code erforderlich, den Server zu starten, nur die Router-Methoden, die betroffen sind):

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

Der folgende Code funktioniert perfekt und beim Senden einer Anfrage mit Postman erhalte ich folgendes Ergebnis: enter image description here

Wie Sie sehen können, zeigt der Status 200, was in Ordnung ist. Aber ist dies der beste Weg, dies zu tun? Gibt es einen Fall, in dem ich den Status selbst setzen müsste, sowie den zurückgegebenen JSON? Oder wird das immer per Express gehandhabt?

Zum Beispiel habe ich nur einen kurzen Test und leicht modifiziert, die get-Methode oben:

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

Wie Sie sehen können, wenn der Benutzer nicht im Array gefunden wird, werde ich gesetzt nur einen Status 404.

Ressourcen/Hinweise, um mehr über dieses Thema zu erfahren, sind mehr als willkommen.

+0

Das ist meine bestbewertesten Antwort und es wird nicht akzeptiert :(@dukable, ich weiß, dass es schon eine Weile her ist, aber hat es dein Problem gelöst? –

+0

@ MichałDudak: Ja, Ihre Antwort sollte die akzeptierte sein. Aber dieser dukable Benutzer ist seit dem 15. Oktober 2015 (wie am 31. Juli 2017) nicht aktiv. +1 für Ihre Antwort anyways;) –

Antwort

22

Status 200 wird der Standard sein, wenn res.send verwenden, res.json usw.

Sie den Status wie res.status(500).json({ error: 'something is wrong' });

Oft setzen kann ich so etwas tun werde ...

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

Dann habe mein Fehler Middleware die Antwort senden, und tun Sie alles andere, was ich tun muss, wenn es einen Fehler gibt.

Zusätzlich: http://expressjs.com/4x/api.html#res.send: res.sendStatus(status) wurde ab Version 4.9.0 http://expressjs.com/4x/api.html#res.sendStatus

102

Express-API-Referenz deckt diesen Fall gegeben.

Kurz gesagt, man muss nur die status Methode aufrufen, bevor json oder send Aufruf:

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

Wenn Sie nur einen Statuscode (keine Daten) senden möchten, wäre die Methode 'res.sendStatus (400);' –

14

I REST-ful URI Design und eine Liste der HTTP Status Codes

Die gute Praxis in Bezug auf Statusantwort zu empfehlen ist das Lesen , vorhersagbar, sende den richtigen HTTP-Statuscode abhängig vom Fehler (4xx für Clientfehler, 5xx für Serverfehler), bezüglich der tatsächlichen JSON-Antwort gibt es keine "Bibel", aber eine gute Idee könnte sein, den Status und die Daten (wieder) zu senden als 2 verschiedene prope In diesem Fall geben Sie dem Client die Möglichkeit, den Status aus den HTTP-Headern und der Nutzlast selbst zu erfassen. Eine dritte Eigenschaft erklärt den Fehler in einer für den Menschen verständlichen Weise eines Fehlers.

Stripe's API verhält sich ähnlich in der realen Welt.

heißt

OK

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

Fehler

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

Man könnte es auf diese Weise tun:

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

Dadurch wird den HTTP-Statuscode 400, es funktioniert auch in Express 4.

+8

'express veraltet res.json (status, obj): Use res.status (status) .json (obj) statt ' Also, 'res.status (400) .json (json_response)' wäre heutzutage genau. –

+0

Ja, danke ... es ist als veraltet gekennzeichnet, funktioniert aber immer noch: P Ihr Kommentar ist gültig, guter Punkt. – mzalazar

1
res.status(500).jsonp(dataRes); 
5

verwende ich in meiner Express.js Anwendung festgelegt:

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