Как получить доступ к телу запроса при отправке 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()
?
Ответы
Ответ 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));
});