Почему node.js сначала возвращает мой запрос, заключенный в объект? [Дубликат]

В x86 возвращаемое значение сохраняется в регистре EAX, который «случайно» также используется этим компилятором для хранения результата арифметических операций (или, по крайней мере, вычитания). Вы можете проверить это, посмотрев сборку, сгенерированную вашим компилятором. Я согласен с kriss - вы не можете предположить, что это всегда будет так, поэтому лучше явно указать возвращаемое значение.

277
задан MightyMouse 31 October 2013 в 02:16
поделиться

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}

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

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

Экспресс

В выражении вы можете сделать это с помощью вместо параметров вместо .

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

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

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

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

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

res.json({ a: 1 });

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

420
ответ дан Nick Klauer 15 August 2018 в 23:40
поделиться
  • 1
    Спасибо за ваше время. Честно говоря, у меня нет проблем с моей стороны. Просто кто-то (в разном часовом поясе) жаловался на формат, который я использовал, потому что он хотел сделать попытку, и по какой-то причине они не могли правильно прочитать мой объект. Спасибо, что заметили прекрасную версию stringify. :) – MightyMouse 31 October 2013 в 02:36
  • 2
    Этот человек действительно должен разбирать строку JSON в объектах или с использованием расширения браузера , а не пытаться делать какие-либо чтения вручную. – bevacqua 31 October 2013 в 02:47
  • 3
    Когда я использую curl из командной строки, приятно иметь новую строку в конце вывода, чтобы моя командная строка не застряла в конце вывода. – amacleod 25 January 2015 в 21:10
  • 4
    @akshay Еще лучше, res.send автоматически установит content-type в JSON, если отправленный элемент является объектом или массивом. – royhowie 12 April 2015 в 00:58
  • 5
    Я думаю, вы хотели использовать res.end() в своем http (не экспресс) примере – Tobias Fünke 5 August 2016 в 11:00

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

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

apiRouter.get('/users', function(req, res){
    var readable = fs.createReadStream(usersFilePath);
    readable.pipe(res);
});
15
ответ дан Connor Leech 15 August 2018 в 23:40
поделиться

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

Пример:

res.json({"foo": "bar"});
298
ответ дан JamieL 15 August 2018 в 23:40
поделиться
  • 1
    Спасибо за ваше время. Тем не менее, мой вопрос тогда не касался заголовков. Это было больше о результатах, которые можно было увидеть сквозь завиток. Еще раз спасибо. – MightyMouse 22 April 2014 в 10:13
  • 2
    Хорошо, но этот метод также возвращает правильно отформатированный JSON. Это часть ответа. Поэтому res.json () устанавливает правильные заголовки, а затем JSON.stringify () ответ для вас автоматически. – JamieL 9 May 2014 в 17:11

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

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

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

4
ответ дан pawelzny 15 August 2018 в 23:40
поделиться

Вы можете использовать промежуточное программное обеспечение для установки стандартного Content-Type и устанавливать Content-Type по-разному для определенных 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>`);
})
0
ответ дан Yuci 15 August 2018 в 23:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: