Как использовать данные JSON POST в приложении Express

Я отправляю следующую строку JSON на свой сервер.

(
        {
        id = 1;
        name = foo;
    },
        {
        id = 2;
        name = bar;
    }
)

На сервере у меня это.

app.post('/', function(request, response) {

    console.log("Got response: " + response.statusCode);

    response.on('data', function(chunk) {
        queryResponse+=chunk;
        console.log('data');
    });

    response.on('end', function(){
        console.log('end');
    });
});

Когда я отправляю строку, это показывает, что я получил ответ 200, но эти два других метода никогда не запускаются. Почему это?

Ответ 1

Я думаю, что вы связываете использование объекта response с request.

Объект response предназначен для отправки ответа HTTP обратно вызывающему клиенту, тогда как вы хотите получить доступ к телу request. Смотрите этот ответ, который дает некоторые рекомендации.

Если вы используете допустимый JSON и размещаете его с Content-Type: application/json, вы можете использовать промежуточное программное обеспечение bodyParser для анализа тела запроса и помещения результата в request.body вашего маршрута.

var express = require('express')
  , app = express.createServer();

app.use(express.bodyParser());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
  response.send(request.body);    // echo the result back
});

app.listen(3000);

Тест по линии:

$ curl -d '{"MyKey":"My Value"}' -H "Content-Type: application/json" http://127.0.0.1:3000/
{"MyKey":"My Value"}

Обновлен для экспресса 4+

Анализатор тела был расколот из в нее собственный пакет NPM после v4, требует отдельной установки npm install body-parser

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

var app = express();

app.use(bodyParser.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);

Обновление для Express 4. 16+

Начиная с версии 4.16.0, доступно новое промежуточное программное обеспечение express.json express.json().

var express = require('express');

var app = express();

app.use(express.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);

Ответ 2

Для Express v4 +

установить body-parser из npm.

$ npm install body-parser

https://www.npmjs.org/package/body-parser#installation

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

var app = express()

// parse application/json
app.use(bodyParser.json())

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next()
})

Ответ 3

Иногда вам не нужны сторонние библиотеки для разбора JSON из текста. Иногда вам нужна следующая команда JS, сначала попробуйте:

        const res_data = JSON.parse(body);

Ответ 4

Для тех, кто получает пустой объект в req.body

Я забыл установить headers: {"Content-Type": "application/json"} в запросе. Изменение решило проблему.

Ответ 5

const express = require('express');
let app = express();
app.use(express.json());

Ответ 6

@Даниэль Томпсон упоминает, что он забыл добавить {"Content-Type": "application/json"} в запросе. Он смог изменить запрос, однако, изменение запросов не всегда возможно (мы работаем над сервером здесь).

В моем случае мне нужно было выполнить синтаксический анализ типа контента: text/plain как json.

Если вы не можете изменить тип содержимого запроса, попробуйте использовать следующий код:

app.use(express.json({type: '*/*'}));

Вместо глобального использования express.json() я предпочитаю применять его только там, где это необходимо, например, в запросе POST:

app.post('/mypost', express.json({type: '*/*'}), (req, res) => {
  // echo json
  res.json(req.body);
});