Prawidłowy sposób zwracania JSON za pomocą node lub Express

Można więc spróbować pobrać następujący obiekt JSON:

$ 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"
}
$

Czy istnieje sposób na wytworzenie dokładnie tego samego ciała w odpowiedzi z serwera za pomocą node lub express? Oczywiście można ustawić nagłówki i wskazać, że content-type odpowiedzi będzie "application / json" , ale wtedy są różne sposoby zapisu / wysłania obiektu. Ten, który widziałem powszechnie używany jest za pomocą polecenia formularza:

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

Ma to jednak dwa punkty, w których jeden można argumentować tak, jakby były "problemami":

  • wysyłamy ciąg znaków.
  • ponadto na końcu nie ma znaku nowej linii.

Innym pomysłem jest użycie polecenia:

response.send(anObject);

Wygląda na to, że wysyła obiekt JSON na podstawie wyjścia curl, podobnie jak w pierwszym przykładzie powyżej. Jednak nie ma nowego znaku linii na końcu ciała, gdy curl jest ponownie używany na terminalu. Jak więc można napisać coś takiego z znak nowej linii dodawany na końcu za pomocą node lub node / express?

Author: MightyMouse, 2013-10-31

5 answers

Ta odpowiedź też jest ciągiem znaków, jeśli chcesz wysłać odpowiedź z jakiegoś niezręcznego powodu, możesz użyć czegoś w rodzaju JSON.stringify(anObject, null, 3)

Ważne jest, aby ustawić nagłówek Content-Type na application/json.

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}

Prettified:

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

Nie jestem do końca pewien, dlaczego chcesz zakończyć go nową linią, ale możesz po prostu zrobić JSON.stringify(...) + '\n', aby to osiągnąć.

Express

W Expressie możesz to zrobić poprzez zmianę opcji zamiast .

'json replacer' JSON replacer callback, domyślnie null

'json spaces' JSON response spaces for formating, defaults to 2 in development, 0 in production

nie zaleca się ustawiania na 40

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

Wtedy mógłbyś po prostu odpowiedzieć jakimś jsonem.

res.json({ a: 1 });

Użyje konfiguracji 'json spaces' do jej poprawienia.

 433
Author: bevacqua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-18 17:46:41

Od Express.js 3x obiekt odpowiedzi posiada metodę json (), która poprawnie ustawia wszystkie nagłówki i zwraca odpowiedź w formacie JSON.

Przykład:

res.json({"foo": "bar"});
 304
Author: JamieL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-07 12:17:52

Jeśli próbujesz wysłać plik json możesz użyć strumieni

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

apiRouter.get('/users', function(req, res){
    var readable = fs.createReadStream(usersFilePath);
    readable.pipe(res);
});
 16
Author: Connor Leech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-26 20:19:59

Można go po prostu ulepszyć za pomocą pipe i jednego z wielu procesorów. Twoja aplikacja powinna zawsze odpowiadać tak małym obciążeniem, jak to możliwe.

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

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

 4
Author: pawelzny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-06 07:10:03

Możesz użyć oprogramowania pośredniczącego, aby ustawić domyślny typ zawartości i ustawić inny typ zawartości dla poszczególnych interfejsów API. Oto przykład:

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>`);
})
 0
Author: Yuci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-22 16:20:51