Подтвердить что ты не робот

Как получить доступ к телу запроса при отправке POST с использованием Node.js и Express?

У меня есть следующий Node.js код:

var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());

app.post('/', function(request, response) {
    response.write(request.body.user);
    response.end();
});

Теперь, если я POST что-то вроде:

curl -d user=Someone -H Accept:application/json --url http://localhost:5000

Я получаю Someone, как ожидалось. Теперь, если я хочу получить тело полного запроса? Я пробовал делать response.write(request.body), но Node.js выдает исключение, говорящее, что "первый аргумент должен быть строкой или буфером", затем переходит к "бесконечному циклу" с исключением, которое гласит: "Невозможно установить заголовки после их отправки."; это также верно, даже если я сделал var reqBody = request.body;, а затем написал response.write(reqBody).

В чем проблема?

Кроме того, могу ли я получить необработанный запрос без использования express.bodyParser()?

4b9b3361

Ответ 1

Экспресс 4.0 и выше:

$ npm install --save body-parser

И затем в вашем приложении node:

const bodyParser = require('body-parser');
app.use(bodyParser);

Экспресс 3.0 и ниже:

Попробуйте передать это в своем вызове cURL:

--header "Content-Type: application/json"

и убедитесь, что ваши данные находятся в формате JSON:

{"user":"someone"}

Кроме того, вы можете использовать console.dir в вашем node.js-коде, чтобы увидеть данные внутри объекта, как в следующем примере:

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

app.use(express.bodyParser());

app.post('/', function(req, res){
    console.dir(req.body);
    res.send("test");
}); 

app.listen(3000);

Этот другой вопрос также может помочь: Как получить JSON в экспресс-запросе node.js POST?

Если вы не хотите использовать bodyParser, проверьте этот другой вопрос: fooobar.com/questions/104496/...

Ответ 2

Как и в случае с Express 4, этот код выглядит следующим образом. Обратите внимание, что вам нужно установить body-parser с помощью npm.

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));


app.listen(8888);

app.post('/update', function(req, res) {
    console.log(req.body); // the posted data
});

Ответ 3

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json())

var port = 9000;

app.post('/post/data', function(req, res) {
    console.log('receiving data...');
    console.log('body is ',req.body);
    res.send(req.body);
});

// start the server
app.listen(port);
console.log('Server started! At http://localhost:' + port);

Это поможет вам. Я предполагаю, что вы отправляете тело в json.

Ответ 4

Из express v4.16 вы можете просто использовать встроенное промежуточное ПО JSON:

app.use(express.json())

Как это:

const express = require('express')

app.use(express.json())    // <==== parse request body as JSON

app.listen(8080)

app.post('/test', (req, res) => {
  res.json({requestBody: req.body})  // <==== req.body will be a parsed JSON object
})

Примечание - body-parser, от которого это зависит, уже включен в экспресс.

Также не забудьте отправить заголовок Content-Type: application/json

Ответ 5

Попробуйте следующее:

response.write(JSON.stringify(request.body));

Это займет объект, который bodyParser создал для вас, и вернет его обратно в строку и напишет его в ответ. Если вам нужен точный корпус запроса (с тем же пробелом и т.д.), Вам понадобятся прослушиватели data и end, прикрепленные к запросу раньше, и создайте кусок строки куском, как вы можете видеть в json синтаксический анализ исходного кода из подключения.

Ответ 6

То, что вы утверждаете, что "попыталось сделать", именно то, что вы написали в коде, который работает "как ожидалось", когда вы вызываете его с помощью curl.

Ошибка, которую вы получаете, похоже, не связана с каким-либо кодом, который вы нам показали.

Если вы хотите получить необработанный запрос, установите обработчики на request для событий data и end (и, конечно же, удалите любые вызовы express.bodyParser()). Обратите внимание, что события data будут встречаться в кусках, и если вы не установите кодировку для события data, эти куски будут буферами, а не строками.

Ответ 7

Это может быть достигнуто без зависимости от body-parser, прослушивать request:data и request:end и вернуть ответ в конце запроса, см. Ниже пример кода. ref: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body

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

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

    // push the data to body
    var body = [];
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      // on end of data, perform necessary action
      body = Buffer.concat(body).toString();
      response.write(request.body.user);
      response.end();
    });
});

Ответ 8

Вы используете следующий код для регистрации данных:

router.post("/users",function(req,res){
    res.send(JSON.stringify(req.body, null, 4));
});