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 demande et le type de contenu est manquant. Même si "Content-Type" est "text/plain", il est analysé comme un JSON, semble-t-il. Est-il possible de demander au middleware de toujours analyser le corps comme une chaîne de texte en clair au lieu de json? Les versions précédentes de req
avaient req.rawBody
pour résoudre ce problème, mais ce n’est plus le cas. Quel est le moyen le plus simple de forcer le corps d'analyse en texte brut/chaîne dans Express?
Si vous supprimez l'utilisation du middleware bodyParser()
, il doit s'agir d'un texte. Vous pouvez consulter la documentation bodyParser
pour plus d'informations: http://www.senchalabs.org/connect/middleware-bodyParser.html
Supprimer cette ligne:
app.use(express.bodyParser());
On dirait que tu as raison. Vous pouvez créer votre propre middleware rawBody
en attendant. Cependant, vous devez toujours désactiver la bodyParser()
. Remarque: req.body
sera toujours undefined
.
Voici une 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 t'aides.
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 app.js
app.use(bodyParser.text());
Aussi dans l'itinéraire souhaité
router.all('/',function(req,res){
console.log(req.body);
})
Par défaut, bodyParser.text()
ne gère que text/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 middleware plainTextParser ( https://www.npmjs.com/package/plaintextparser ).
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 de express et bodyParser a été mise à niveau vers les versions appropriées. Express ˜4.x et bodyParser 1.18.x. Ça devrait le faire. Avec cela en place ce qui suit devrait fonctionner
app.use (bodyParser.text ());