2013-10-31 14 views
237

So Express, kann man versuchen, das folgende JSON-Objekt zu holen:Richtiger Weg JSON mit Knoten zurückzukehren oder

$ 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 einen Weg, um genau den gleichen Körper in einer Antwort von einem Server unter Verwendung von Knoten zu erzeugen oder ausdrücken? Natürlich kann man die Header setzen und angeben, dass der Inhaltstyp der Antwort "application/json" sein wird, aber es gibt verschiedene Möglichkeiten, das Objekt zu schreiben/zu senden. Die eine, die ich häufig verwendete gesehen haben wird, ist durch einen Befehl der Form unter Verwendung von:

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

Doch diese zwei Punkte hat, wo man argumentieren könnte, als ob sie „Probleme“ waren:

  • Wir senden eine Zeichenfolge.
  • Darüber hinaus gibt es am Ende kein neues Zeilenzeichen.

Eine weitere Idee ist es, den Befehl zu verwenden:

response.send(anObject); 

Dies erscheint über ein JSON Objekt basierend auf der Ausgabe der Kräuselung ähnlich dem ersten Beispiel sendet werden. Es gibt jedoch kein neues Zeilenzeichen am Ende des Körpers, wenn an einem Terminal erneut eine Krümmung verwendet wird. Also, wie kann man etwas so aufschreiben mit einem neuen Zeilenzeichen am Ende mit Knoten oder Knoten/Express angehängt?

Antwort

362

Diese Antwort ist eine Zeichenfolge, auch, wenn Sie die Antwort prettified, aus irgendeinem Grund unbeholfen senden möchten, können Sie so etwas wie JSON.stringify(anObject, null, 3)

nutzen könnten Es ist wichtig, dass Sie den Content-Type Header application/json auch eingestellt.

var http = require('http'); 

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

// > {"a":1} 

Verschönerte:

var http = require('http'); 

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

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

Ich bin mir nicht ganz sicher, warum Sie es mit einem Newline beenden wollen, aber man konnte nicht nur JSON.stringify(...) + '\n' das zu erreichen.

Express

Expressgut Sie dies durch changing the options instead tun können.

'json replacer' JSON replacer Rückruf, null standardmäßig

'json spaces' JSON Antwort Räume für die Formatierung, standardmäßig 2 in Entwicklung, 0 in Produktion

Nicht empfehlenswert tatsächlich bis 40 einzustellen

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

Dann könnte man einfach resp ond mit etwas json.

res.json({ a: 1 }); 

Es wird die 'json spaces Konfiguration verwenden, um es zu verschönern.

+2

Vielen Dank für Ihre Zeit. Um ehrlich zu sein, habe ich kein Problem an meinem Ende. Es ist nur so, dass jemand (in einer anderen Zeitzone) sich über das Format beschwert hat, das ich benutzt habe, weil er einen Versuch machen wollte und aus irgendeinem Grund mein Objekt nicht richtig lesen konnte. Danke für die bemerkenswerte Version von stringify. :) – MightyMouse

+1

Dieser Jemand sollte wirklich die JSON-Zeichenfolge in Objekte oder [mithilfe einer Browsererweiterung] (https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc?hl=de) analysieren, anstatt zu versuchen Lese von Hand. – bevacqua

+1

Wenn ich 'curl' von der Befehlszeile verwende, ist es nett, den Zeilenumbruch am Ende der Ausgabe zu haben, so dass meine Eingabeaufforderung nicht am Ende der Ausgabe hängen bleibt. – amacleod

257

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"}); 
+0

Vielen Dank für Ihre Zeit. Allerdings ging es mir damals nicht wirklich um Header. Es ging mehr um das Ergebnis, das man durch Locken sagen konnte. Nochmals vielen Dank. – MightyMouse

+32

OK, aber diese Methode gibt auch korrekt formatierten JSON zurück. Es ist Teil der Antwort. So res.json() setzt die richtigen Header und dann JSON.stringify() ist die Antwort für Sie automatisch. – JamieL

15

Wenn Sie versuchen, eine JSON-Datei senden Sie verwenden können Ströme

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

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

Sie können es nur prettify Rohr und einer von vielen Prozessor. Ihre App sollte immer so klein wie möglich antworten.

$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue | underscore print 

https://github.com/ddopson/underscore-cli

Verwandte Themen