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