Comment forcer l'analyse du corps de la requête en texte brut au lieu de json dans Express?
J'utilise nodejs + Express (v3) comme ceci:
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
});
J'ai vérifié les en-têtes de requête et le type de contenu est manquant. Même si " Content-Type "est" text/plain", il est en train d'analyser en tant que JSON, il semble. Est - il de toute façon de dire au middleware d'analyser toujours le corps comme une chaîne de texte brut au lieu de json? Les versions antérieures de req
avaient l'habitude d'avoir req.rawBody
qui contournerait ce problème mais maintenant ce n'est plus le cas. Quel est le moyen le plus simple de forcer l'analyse du corps en tant que texte brut/chaîne dans Express?
6 réponses
Si vous supprimez l'utilisation du middleware bodyParser()
, il devrait s'agir de texte. Vous pouvez consulter les documents bodyParser
pour plus d'Informations: http://www.senchalabs.org/connect/middleware-bodyParser.html
Supprimer cette ligne:
app.use(express.bodyParser());
Modifier:
On dirait que tu as raison. Vous pouvez créer votre propre middleware rawBody
entre-temps. Cependant, vous devez toujours désactiver le bodyParser()
. Remarque: req.body
sera toujours undefined
.
Voici un Démo:
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);
})
J'espère que cela aide.
Dans express 4.x vous pouvez utiliser l'analyseur de texte de bodyParser https://www.npmjs.org/package/body-parser
Il suffit d'ajouter dans l'application.js
app.use(bodyParser.text());
Également dans l'itinéraire souhaité
router.all('/',function(req,res){
console.log(req.body);
})
Par défaut bodyParser.text()
gère uniquement le texte/plain. Modifiez les options de type pour inclure */json
ou */*
.
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:"*/*"}));
, Vous pouvez trouver les docs ici
Vous pouvez utiliser le plainTextParser (https://www.npmjs.com/package/plaintextparser) middleware..
let plainTextParser = require('plainTextParser');
app.use(plainTextParser());
Ou
app.post(YOUR_ROUTE, plainTextParser, function(req, res) {
let text = req.text;
//DO SOMETHING....
});
, je l'ai fait:
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);
})
Assurez-vous que la version d'express et bodyParser a été mise à niveau vers les versions appropriées. Express 4.x et bodyParser 1.18.x. Cela devrait le faire. Avec cela en place, ce qui suit devrait fonctionner
App.utilisation (bodyParser.texte ());