Як я споживаю дані 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 та розміщуєте його 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+

Аналізатор тіла був розділений на власний пакет 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()проміжне програмне забезпечення.

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);
Tommy Stanton

4
Ця відповідь застаріла, але відповідь від @chrisarton актуальна.
Еміль Інгерслів

209

Для Express v4 +

встановити аналізатор тіла з 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 Отже, це (Express) буде більш худорлявим і для тих, хто цього не потребує / не потребує.
andyengle

6
@andyengle Це має сенс. Але я думаю, що практично кожен використовує для розбору запитів. Це здається для мене основною особливістю.
light24bulbs

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

3
Якщо вийти з експресу, це не дозволяє використовувати програми, які не використовують запити. Вони могли зробити його окремим і включити його в експрес за замовчуванням.
JJ

18

Іноді для розбору JSON з тексту не потрібні сторонні бібліотеки. Іноді все, що вам потрібно, наступна команда JS, спробуйте спочатку:

        const res_data = JSON.parse(body);

3
Оригінальне питання стосується розбору JSON з повідомлення POST в рамках Express. Без проміжного програмного забезпечення BodyParser дані JSON не будуть існувати у властивості тіла об’єкта запиту.
ThisClark

1
Я вважаю це корисним під час аналізу відповіді сервера. Дякую!
Hasan Alsawadi

1
Дякую, Хасане, я ціную твій коментар. Це мені допомогло, коли я шукав рішення і натрапив на цю посаду. Не впевнений, чи працює він у всіх випадках, але він, безумовно, працює в деяких, і це краще рішення, ніж використання бібліотеки сторонніх виробників.
xims

1
Ваша відповідь та коментар надають відповіді більше інформації (більше інформації тут ваша відповідь). Вам слід оновити свою відповідь, щоб вказати, що експрес потребує аналізатора тіла, або надати альтернативу, щоб вказати, як тіло-аналізатор отримав дані в першу чергу.
dewwwald

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.