Как получить доступ к телу запроса при разноске с помощью узла.js и Экспресс?



у меня есть следующий узел.код 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();
});


теперь, если я опубликую что-то вроде:



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


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



в чем тут проблема?



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

541   8  

8 ответов:

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

$ npm install --save body-parser

а затем в вашем узле приложения:

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

Express 3.0 и ниже:

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

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

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

{"user":"someone"}

кроме того, вы можете использовать консоль.реж в вашем узле.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 в экспресс-узле.JS в POST-запросе?

если вы не хотите использовать bodyParser проверьте этот другой вопрос:https://stackoverflow.com/a/9920700/446681

по состоянию на 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
});
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.

от экспресс v4. 16, вы можете просто использовать встроенный JSON middleware:

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

попробуйте это:

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

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

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

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

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

это может быть достигнуто без 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();
    });
});

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

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

Comments

    Ничего не найдено.