it-swarm.com.de

Die richtige Art, JSON über Knoten oder Express zurückzugeben

Man kann also versuchen, folgendes 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 denselben Körper in einer Antwort von einem Server zu erzeugen, der einen Knoten oder einen Express verwendet? Natürlich kann man die Kopfzeilen setzen und angeben, dass der Inhaltstyp der Antwort "application/json" lautet, aber es gibt verschiedene Möglichkeiten, das Objekt zu schreiben/senden. Die, die ich häufig gesehen habe, ist die Verwendung eines Befehls der Form:

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

Dies hat jedoch zwei Punkte, an denen man argumentieren könnte, als wären sie "Probleme":

  • Wir senden eine Zeichenfolge.
  • Außerdem gibt es am Ende kein neues Zeilenzeichen.

Eine andere Idee ist, den Befehl zu verwenden:

response.send(anObject);

Dies scheint das Senden eines JSON-Objekts basierend auf der Ausgabe von curl zu sein, ähnlich wie im ersten Beispiel oben. Es gibt jedoch kein neues Zeilenzeichen am Ende des Körpers, wenn curl wieder in einem Terminal verwendet wird. Wie kann man also so etwas aufschreiben, wenn am Ende ein neues Zeilenzeichen mit Knoten oder Knoten/Express angehängt wird?

329
MightyMouse

Diese Antwort ist auch eine Zeichenfolge. Wenn Sie die Antwort verettert senden möchten, können Sie aus unangenehmen Gründen etwas wie JSON.stringify(anObject, null, 3) verwenden.

Es ist wichtig, dass Sie auch den Header Content-Type 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}

Verklärt:

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 ganz sicher, warum Sie es mit einem Newline beenden wollen, aber Sie könnten einfach JSON.stringify(...) + '\n' tun, um dies zu erreichen.

Ausdrücken

In express können Sie dies durch stattdessen die Optionen ändern .

'json replacer' JSON-Replacement-Callback, standardmäßig null

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

Nicht empfohlen, auf 40 zu setzen

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

Dann könntest du einfach mit etwas Json antworten.

res.json({ a: 1 });

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

484
bevacqua

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

Beispiel:

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

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

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

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

Sie können es einfach mit Pipe und einem von vielen Prozessoren verbessern. Ihre App sollte immer mit einer möglichst geringen Last antworten.

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

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

4
pawelzny

Sie können eine Middleware verwenden, um den Standardinhaltstyp festzulegen und den Inhaltstyp für bestimmte APIs anders einzustellen. Hier ist ein Beispiel:

const express = require('express');
const app = express();

const port = process.env.PORT || 3000;

const server = app.listen(port);

server.timeout = 1000 * 60 * 10; // 10 minutes

// Use middleware to set the default Content-Type
app.use(function (req, res, next) {
    res.header('Content-Type', 'application/json');
    next();
});

app.get('/api/endpoint1', (req, res) => {
    res.send(JSON.stringify({value: 1}));
})

app.get('/api/endpoint2', (req, res) => {
    // Set Content-Type differently for this particular API
    res.set({'Content-Type': 'application/xml'});
    res.send(`<note>
        <to>Tove</to>
        <from>Jani</from>
        <heading>Reminder</heading>
        <body>Don't forget me this weekend!</body>
        </note>`);
})
2
Yuci

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

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

oder einfach nur das

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

Ältere Version von Express verwenden app.use(express.json()) oder bodyParser.json()Lesen Sie mehr über bodyParser Middleware

In der neuesten Version von Express können Sie einfach res.json() verwenden.

const express = require('express'),
    port = process.env.port || 3000,
    app = express()

app.get('/', (req, res) => res.json({key: "value"}))

app.listen(port, () => console.log(`Server start at ${port}`))
0
Aung Zan Baw