У res.json нет заголовков для кода статуса http - PullRequest
0 голосов
/ 10 апреля 2019

Я бы хотел, чтобы заголовки сопровождали объект json, который я отправляю.Когда я пытаюсь setHeaders, я получаю ошибку Can't set headers after they are sent..

Я вижу в этом ТАКОМ сообщении , что

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

Однако, когда я выполняю res.status(404).json({"error", "message not found"}), никакие заголовки (статус http) не сопровождают объект json, который отправляется клиенту.Все, что видит клиент, это:

{
          "error:": "Message Not Found"
}

Веб-сервис:

var express = require('express');
var bodyParser  = require('body-parser');
var crypto = require('crypto');

var app = express();
var message_dict = [];
app.set('json spaces', 40);

app.use(bodyParser.urlencoded({
  extended: true
}));

app.use(bodyParser.json());
app.use(express.json());

app.post('/messages', function(request, response){
    var string_message = request.body.message;
    var json_obj = request.body
    var hash_key = crypto.createHash('sha256').update(string_message).digest('hex');
    message_dict[hash_key] = json_obj
    var encrypted_data = {'digest' : hash_key};
    response.json(encrypted_data);

});

app.get('/messages/*', function(request, response) {
  var hash_key = request.params[0];

  if(hash_key in message_dict){
    response.json(message_dict[hash_key]);
  }
  else{
    response.status(404).json({'error:' : 'Messag Not Found'})
  }

});



app.listen(8080, function() {
  console.log('Example app listening on port 8080!');
});

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Я думаю, что вы путаете заголовки ответа и тело ответа, .json() устанавливает правильные заголовки ответа (в частности, Content-Type), тело ответа по-прежнему является только параметром, который вы передаете в вызов.

Есть ли конкретная причина, по которой вы хотите, чтобы заголовки ответа появлялись в теле ответа?Заголовки ответа обычно очень мало полезны для запрашивающей стороны и могут быть легко доступны при получении ответа от сервера (свойство res.headers).

Чтобы действительно ответить на ваш вопрос (не уверен, почему вы это сделаете):

var json = {'error:' : 'Messag Not Found'}
response.type('application/json')
response.writeHead(404)
json.headers = response._header; // _header not documented but works
response.end(JSON.stringify(json));
0 голосов
/ 10 апреля 2019

Во-первых, поскольку вы публикуете этот вопрос сейчас, я предполагаю, что вы используете Express 4.x вместо 3.x, то есть версии Express, на которую есть ссылка в той публикации SO, на которую вы ссылаетесь, поэтому не следуйте совет этого поста, который несколько лет назад. Функциональность многих функций изменена с версии 3 на версию 4, поэтому многие ответы о поведении определенных функций могут быть устаревшими. Документацию по Express 4 можно найти здесь .

Я думаю, что вы можете путать функцию app.set() для функции res.set(). Функция app.set() устанавливает настройки приложения для вашего приложения, а не значения заголовка для объекта ответа. См. здесь для получения дополнительной информации о том, как использовать функцию app.set().

Если вы хотите установить отдельные значения заголовка для объекта ответа, вам нужно использовать функцию res.set(). Документацию для функции res.set() можно найти здесь . С помощью этой функции вы можете установить индивидуальные или множественные значения заголовка в зависимости от того, какие параметры вы передаете в функцию. Вы бы вызвали эту функцию в функции обратного вызова вашего индивидуального определения маршрута.

И для решения вашей первоначальной проблемы, описанной выше, функция res.status() просто устанавливает свойство res.statusCode объекта ответа на любое указанное вами значение, тогда как функция res.json() устанавливает тело объекта ответа на указанный вами объект JSON. Короче говоря, ни одна из этих или каких-либо других функций Express автоматически не добавляет значения к объекту ответа без явного указания на это.

...