597 Stimmen

Richtiger Weg, JSON mithilfe von Node oder Express zurückzugeben

Also kann man versuchen, das folgende JSON-Objekt abzurufen:

$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=ISO-8859-1
Date: Wed, 30 Oct 2013 22:19:10 GMT
Server: Google Frontend
Cache-Control: private
Alternate-Protocol: 80:quic,80:quic
Transfer-Encoding: chunked

{
   "anotherKey": "anotherValue",
   "key": "value"
}
$

Gibt es eine Möglichkeit, genau den gleichen Body in einer Antwort von einem Server mithilfe von node oder express zu erzeugen? Offensichtlich kann man die Header setzen und angeben, dass der Content-Type der Antwort "application/json" sein wird, aber dann gibt es unterschiedliche Möglichkeiten, das Objekt zu schreiben/senden. Die häufig verwendete Methode, die ich gesehen habe, ist die Verwendung eines Befehls der Form:

response.write(JSON.stringify(anObject));

Allerdings gibt es zwei Punkte, bei denen man argumentieren könnte, dass es "Probleme" gibt:

  • Wir senden einen String.
  • Außerdem gibt es kein Zeilenumbruchszeichen am Ende.

Eine andere Idee ist die Verwendung des Befehls:

response.send(anObject);

Dies scheint ein JSON-Objekt zu senden, basierend auf der Ausgabe von curl ähnlich wie im ersten Beispiel oben. Allerdings gibt es kein Zeilenumbruchszeichen am Ende des Bodens, wenn curl erneut in einem Terminal verwendet wird. Wie also kann man tatsächlich etwas ähnliches mit einem Zeilenumbruchszeichen am Ende mit node oder node/express schreiben?

808voto

bevacqua Punkte 45226

Diese Antwort ist auch ein String, wenn Sie die Antwort aus irgendeinem seltsamen Grund formatiert senden möchten, könnten Sie etwas wie JSON.stringify(anObject, null, 3) verwenden

Es ist wichtig, dass Sie auch den Content-Type Header auf application/json setzen.

var http = require('http');

var app = http.createServer(function(req,res){
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify({ a: 1 }));
});
app.listen(3000);

// > {"a":1}

Formatiert:

var http = require('http');

var app = http.createServer(function(req,res){
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify({ a: 1 }, null, 3));
});
app.listen(3000);

// >  {
// >     "a": 1
// >  }

Ich bin mir nicht sicher, warum Sie es mit einem Zeilenumbruch beenden möchten, aber Sie könnten einfach JSON.stringify(...) + '\n' machen, um das zu erreichen.

Express

In Express können Sie dies tun, indem Sie die Optionen ändern.

'json replacer' JSON-Ersatzfunktion, standardmäßig null

'json spaces' JSON-Antworträume zur Formatierung, standardmäßig 2 in der Entwicklung, 0 in der Produktion

Nicht wirklich empfohlen, auf 40 zu setzen

app.set('json spaces', 40);

Dann könnten Sie nur mit etwas JSON antworten.

res.json({ a: 1 });

Es wird die Konfiguration 'json spaces' verwenden, um es zu formatieren.

490voto

JamieL Punkte 5303

Seit Express.js 3x hat das Antwortobjekt eine json() Methode, die alle Header korrekt für Sie setzt und die Antwort im JSON-Format zurückgibt.

Beispiel:

res.json({"foo": "bar"});

49voto

IXOVER Punkte 531

Wenn Sie Express verwenden, können Sie Folgendes verwenden:

res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({key:"value"}));

oder einfach das:

res.json({key:"value"});

27voto

vkarpov15 Punkte 3089

Die res.json() Funktion sollte für die meisten Fälle ausreichen.

app.get('/', (req, res) => res.json({ answer: 42 }));

Die res.json() Funktion konvertiert den Parameter, den Sie übergeben, in JSON, indem sie JSON.stringify() verwendet und den Content-Type Header auf application/json; charset=utf-8 setzt, damit HTTP-Clients automatisch wissen, wie sie die Antwort parsen sollen.

21voto

Connor Leech Punkte 16726

Wenn Sie versuchen, eine JSON-Datei zu senden, können Sie Streams verwenden

var fs = require('fs');

var usersFilePath = path.join(__dirname, 'users.min.json');

apiRouter.get('/users', function(req, res){
    var readable = fs.createReadStream(usersFilePath);
    readable.pipe(res);
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X