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

307

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

Нейромант
источник

Ответы:

479

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

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

Если вы используете действительный JSON и размещаете его с помощью POST 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+

После 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);
Перо П.
источник
21
request.body.MyKey
Перо П.
5
Потому что конкатенация вызывает toString()объект. Взгляните на документацию по узлу console.log, поскольку он проверяет объект и возвращает строковое представление.
Перо П.
13
console.log('request =' + JSON.stringify(request.body))
Перо П.
3
Текущий console.log()автоматически раскроет объект (через util.inspect()), так что это будет работать:console.log("with request", request.body);
Томми Стэнтон
4
Этот ответ устарел, но ответ @chrisarton актуален.
Эмиль Ингерслев
209

Для 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()
})
chrisarton
источник
23
почему они продолжают брать вещи, которые все используют?
light24bulbs
11
@ light24bulbs Так что (Экспресс) будет более скудным и значимым для тех, кто не использует / нуждается в этом.
andyengle
6
@andyengle Это имеет смысл. Но я думаю, что практически каждый использует разбор запросов. Это кажется мне основной особенностью.
light24bulbs
23
Поскольку интерфейс функций промежуточного программного обеспечения является стандартом, используемым многими библиотеками, он также позволяет приложениям, которые не используют Express, использовать эти функции промежуточного программного обеспечения.
Апт
3
Изъятие из экспресса не позволяет использовать его приложениями, которые не используют запросы. Они могли бы сделать это отдельно и включить его в экспресс по умолчанию.
JJ
18

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

        const res_data = JSON.parse(body);
XIMS
источник
3
Первоначальный вопрос касается синтаксического анализа JSON из сообщения POST в среде Express. Без промежуточного программного обеспечения BodyParser данные JSON не будут существовать в свойстве body объекта запроса.
ThisClark
1
Я нашел это полезным при анализе ответа сервера. Спасибо!
Хасан Альсавади
1
Спасибо Хасан, я ценю ваш комментарий. Это помогло мне, когда я искал решение и наткнулся на этот пост. Не уверен, что он работает во всех случаях, но он определенно работает в некоторых, и это лучшее решение, чем использование сторонней библиотеки.
Xims
1
Ваш ответ и комментарий предоставляют ответ с большей информацией (чем больше информации, тем больше ваш ответ здесь). Вы должны обновить свой ответ, чтобы указать, что express нуждается в парсере тела, или дать альтернативу, чтобы указать, каким образом парсер тела получил данные в первую очередь.
августа
2
не определяетbody
jameshfisher
15

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

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

Дэниел Томпсон
источник
Не могу поверить, что я пропустил это! Я отправляю с text/jsonи получаю {}как ответ. Тотальный надзор с моей стороны. Очень полезно.
Джеймс М. Лэй
Тьфу - я тоже это пропустил. Спасибо за публикацию, чтобы я не тратил больше времени, чем у меня уже есть!
Стив Гомес
9

@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);
});
anneb
источник
7

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

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

Сура
источник