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

Как заставить тело запроса синтаксиса использовать как обычный текст вместо json в Express?

Я использую nodejs + Express (v3) следующим образом:

app.use(express.bodyParser());
app.route('/some/route', function(req, res) {
  var text = req.body; // I expect text to be a string but it is a JSON
});

Я проверил заголовки запросов и отсутствовал тип содержимого. Даже если "Content-Type" является "text/plain", он разбирается как JSON. Есть ли вообще сказать, что промежуточное ПО всегда анализирует тело как обычную текстовую строку вместо json? Раньше версии req имели req.rawBody, которые могли бы обойти эту проблему, но теперь этого больше нет. Каков самый простой способ заставить тело синтаксиса как обычный текст/строку в Express?

4b9b3361

Ответ 1

Если вы удалите использование промежуточного программного обеспечения bodyParser(), это должен быть текст. Вы можете просмотреть документы bodyParser для получения дополнительной информации: http://www.senchalabs.org/connect/middleware-bodyParser.html

Удалите эту строку:

app.use(express.bodyParser());

EDIT:

Похоже, ты прав. Тем временем вы можете создать свое собственное промежуточное программное обеспечение rawBody. Однако вам все равно нужно отключить bodyParser(). Примечание: req.body по-прежнему будет undefined.

Вот демо:

app.js

var express = require('express')
  , http = require('http')
  , path = require('path')
  , util = require('util');

var app = express();

function rawBody(req, res, next) {
  req.setEncoding('utf8');
  req.rawBody = '';
  req.on('data', function(chunk) {
    req.rawBody += chunk;
  });
  req.on('end', function(){
    next();
  });
}

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.use(rawBody);
  //app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
});

app.post('/test', function(req, res) {
  console.log(req.is('text/*'));
  console.log(req.is('json'));
  console.log('RB: ' + req.rawBody);
  console.log('B: ' + JSON.stringify(req.body));
  res.send('got it');
});

http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

test.js

var request = require('request');

request({
  method: 'POST',
  uri: 'http://localhost:3000/test',
  body: {'msg': 'secret'},
  json: true
}, function (error, response, body) {
  console.log('code: '+ response.statusCode);
  console.log(body);
})

Надеюсь, что это поможет.

Ответ 2

В экспресс 4.x вы можете использовать синтаксический анализатор текста из bodyParser https://www.npmjs.org/package/body-parser

просто добавьте в app.js

app.use(bodyParser.text());

Также на желаемом маршруте

router.all('/',function(req,res){
    console.log(req.body);

})

Ответ 3

По умолчанию bodyParser.text() обрабатывает только текст /plain. Измените параметры типа, чтобы включить */json или */*.

app.use('/some/route', bodyParser.text({type: '*/*'}), function(req, res) {
  var text = req.body; // I expect text to be a string but it is a JSON
});

//or more generally:
app.use(bodyParser.text({type:"*/*"}));

Здесь вы можете найти документы

Ответ 4

Вы можете использовать промежуточное программное обеспечение plainTextParser (https://www.npmjs.com/package/plaintextparser).

let plainTextParser = require('plainTextParser');
app.use(plainTextParser());

или

app.post(YOUR_ROUTE, plainTextParser, function(req, res) {             
  let text = req.text;

  //DO SOMETHING....
}); 

Ответ 5

Я сделал это:

router.route('/')
.post(function(req,res){
    var chunk = '';

    req.on('data', function(data){
        chunk += data; // here you get your raw data.
    })        

    req.on('end', function(){

        console.log(chunk); //just show in console
    })
    res.send(null);

})

Ответ 6

Express по типу контента понимает, как декодировать тело. Он должен иметь определенные декодеры в промежуточном программном обеспечении, которое встроено в библиотеку из 4.x:

app.use(express.text())
app.use(express.json())

Ответ 7

Убедитесь, что версия express и bodyParser были обновлены до соответствующих версий. Экспресс ˜4.x и bodyParser ˜1.18.x. Это должно сделать это. С этим на месте должно работать следующее

app.use(bodyParser.text());