Правильный способ возврата JSON с помощью node или Express

таким образом, можно попытаться получить следующий объект 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"
}
$

есть ли способ создать точно такое же тело в ответе от сервера с помощью node или express? Ясно, что можно установить заголовки и указать, что тип содержимого ответа будет "application/json", но тогда есть разные способы записи/отправки объекта. Тот, который я видел, обычно используется, используя команду формы:

response.write(JSON.stringify(anObject));
, это два момента, когда можно спорить, как если бы это были "проблемы":
  • мы посылаем строку.
  • кроме того, в конце нет нового символа строки.

еще одна идея-использовать команду:

response.send(anObject);

похоже, что это отправка объекта JSON на основе вывода curl, аналогичного первому примеру выше. Однако в конце тела нет нового символа строки, когда curl снова используется на терминале. Итак, как можно на самом деле записывают что-то вроде этого с новым символом строки, добавленным в конце, используя node или node/express?

5 ответов


этот ответ тоже строку, если вы хотите отправить ответ приукрашивали, по непонятным мне причинам, вы могли бы использовать что-то вроде JSON.stringify(anObject, null, 3)

важно, чтобы вы установили Content-Type заголовок 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}

приукрашивали:

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

Я не совсем уверен, почему вы хотите завершить его с новой строкой, но вы можете просто сделать JSON.stringify(...) + '\n' для достижения этой цели.

Экспресс

в Express вы можете сделать это изменение параметров вместо.

'json replacer' обратный вызов заменителя JSON, null по умолчанию

'json spaces' пространства ответов JSON для форматирования, по умолчанию 2 в разработке, 0 в производстве

на самом деле не рекомендуется устанавливать 40

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

тогда вы можете просто ответить некоторым json.

res.json({ a: 1 });

он будет использовать 'json spaces' конфигурация, чтобы украсить его.


С Express.JS 3x объект response имеет метод json (), который правильно устанавливает все заголовки для вас и возвращает ответ в формате JSON.

пример:

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

Если вы пытаетесь отправить файл json, вы можете использовать streams

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

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

вы можете просто украсить его с помощью трубы и одного из многих процессоров. Ваше приложение всегда должно отвечать с как можно меньшей нагрузкой.

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

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


вы можете использовать промежуточное ПО для установки типа контента по умолчанию и задать тип контента по-разному для определенных API. Вот пример:

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