Как использовать данные 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()
})

23
почему они продолжают брать вещи, которые все используют?
— light24bulbs

11
@ light24bulbs Так что (Экспресс) будет более скудным и значимым для тех, кто не использует / нуждается в этом.
— andyengle

6
@andyengle Это имеет смысл. Но я думаю, что практически каждый использует разбор запросов. Это кажется мне основной особенностью.
— light24bulbs

23
Поскольку интерфейс функций промежуточного программного обеспечения является стандартом, используемым многими библиотеками, он также позволяет приложениям, которые не используют Express, использовать эти функции промежуточного программного обеспечения.
— Апт

3
Изъятие из экспресса не позволяет использовать его приложениями, которые не используют запросы. Они могли бы сделать это отдельно и включить его в экспресс по умолчанию.
— JJ

18

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

        const res_data = JSON.parse(body);

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);
});

7

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.