it-roy-ru.com

Как использовать данные 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, но эти два других метода никогда не запускаются. Это почему?

255
neuromancer

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

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

После v4 парсер тела был разбит на собственный пакет npm, требует отдельной установки 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() .

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);
386
Pero P.

Для 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()
})
193
chrisarton

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

        const res_data = JSON.parse(body);
10
xims
const express = require('express');
let app = express();
app.use(express.json());

Этот app.use (express.json) теперь позволяет читать объект JSON входящего сообщения.

3
SuRa

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

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

3
Daniel Thompson

@ Даниэль Томпсон упоминает, что он забыл добавить {"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);
});
0
anneb