6
votes

Obtenez RAWBOY dans Express

Bonjour, j'essaie de récupérer quelque chose du poteau et de répondre à la propriété RAWBOWE de la demande entrante. Comment puis-je le récupérer ??

J'ai essayé d'utiliser express.bodyparser () et dans mon gestionnaire de poteau, je cherchais que Req.Rawbody, et c'était indéfini. P>

J'ai même essayé avec Connect .bodyparser (), mais je n'ai toujours pas de chance avec ça. Je deviens indéfini pour Rawbody. P>

Je lisais sur le site StackoverFlow disant qu'ils avaient supprimé la fonctionnalité RAWBORE, mais mentionné qu'il s'agissait d'une solution rapide pour l'ajouter à notre propre fichier middleware. Je suis un débutant, alors je n'ai pas d'idée de savoir comment y parvenir. Vous trouverez ci-dessous mon extrait de code. P>

/**
 * Module dependencies.
 */

var express = require('express')
  , connect = require('connect')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
//app.use(express.bodyParser());
app.use(connect.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);



/**custom stuff**/

app.post('/upload',function(req, res){
        console.log(req.header('Content-Type'));
        console.log(req.header('Host'));
        console.log(req.header('User-Agent'));

        console.log(req.rawBody);
        console.log(req.body);
        res.send("<h1> Hello the response is "+req.body.username);
});

/** end**/

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


0 commentaires

4 Réponses :


10
votes

Vous pouvez utiliser votre propre Ware Middle pour le faire: XXX


7 commentaires

Rikky, s'il te plaît, ça ne me dérange pas que je demande, mais où est-ce que je mets ça ?? et comment puis-je y accéder? J'ai fait une petite lecture sur le middleware, mais je n'ai pas compris. Aussi comment puis-je l'intégrer avec le Bodyparser?


Vous êtes les bienvenus, vous pouvez remplacer cela à Bodyparser Middle Ware. Eh bien, le Moyen Ware n'est qu'un processus à faire avant ou après une demande. Ici, vous souhaitez lier des données brutes que vous avez traitées dans la demande avant la course d'itinéraire, puis la mettez avant tout enregistrement de route. Maintenant, de votre itinéraire, utilisez simplement le chemin Req.Raw, BTW Je vais mettre à jour ma réponse pour le rendre clairement: D


Oh! Plus de mise à jour: vous n'avez pas à retirer le Bodyparser, laissez-la simplement là-bas, vous pourriez en avoir besoin à d'autres fins. Donc pas d'intégration nécessaire


@Rikky à la fois bodyparser et votre middleware va lire les données entrantes, et comme c'est un flux, seul l'un des deux va le lire. L'autre ne recevra jamais l'événement et la demande sera suspendue.


Oui tu as raison. Je pense à ce que vous envisagez de vous en débarrasser, mais juste un hachoir sale :(


@robertklep Quelle version de Express a fait ce commentaire? J'utilise cette solution avec V4.17.1 et Bodyparser et mon middleware semblent recevoir les deux événements, séparément. C'est à dire. Cela fonctionne bien ici, dans tous les cas de bord, je pouvais penser aux tests. Est-ce que quelque chose a peut-être changé dans la mise en œuvre express, depuis? (notamment, enregistrer de multiples manutentionnaires «extrémités» avec un débogage Printf, par exemple, les déclenche clairement tous.)


J'ai découvert le problème avec la solution ci-dessus: ensuite a été appelée à partir de fin. En utilisant des promesses et qui céder immédiatement au middleware suivant résout ce problème. Voir ma réponse ci-dessous.



2
votes

Je suis de retour: d. Après avoir lu le Connect.Bodyparser, j'ai trouvé quelque chose: le Bodyparser Analysez uniquement les données que le type MIME est l'une des suivantes: Application / JSON, Application / X-www-Form-URLencodé et Multipart / Form-Data. Je pense donc que c'est une autre approche, ce n'est généralement pas élégant mais acceptable: lorsque vous essayez d'envoyer des données brutes au serveur, modifiez le type MIME à quelque chose de différent. Comme votre question, c'est une chaîne, je choisis donc un texte / un exemple comme exemple: xxx pré>

Je l'ai testé via CURL: P>

$ curl -d 'test=hello' -H  'Content-Type:text/plain' 127.0.0.1:3000/test
// console result:
Mime type is:text/plain
Raw data is:test=hello
Body via bodyParser is: 
{}


0 commentaires

1
votes

bâtiment de la solution de @ Rikky, le moyen d'éviter une condition de course dans les gestionnaires d'événements de données consiste à continuer à appeler la chaîne de middleware immédiatement après avoir défini les gestionnaires. N'attendez pas que req.on («fin») appelez ensuite (), car celui-ci suivant () est ce qui permet à l'analyseur du corps JSON d'enregistrer ses propres données et ses gestionnaires de fin; Si vous attendez jusqu'à ce que la fin soit déclenchée sur la demande, ils manqueront tous les événements pertinents. Au lieu de cela, utilisez des promesses: xxx


1 commentaires

Merci beaucoup! Je ne pouvais pas faire fonctionner à tout moment, tout fonctionne bien! Je ne sais pas si sa bonne idée, mais si vous ne voulez pas vous promettre dans votre RAWbody, faites simplement app.use ('/', async (req, res, résultant) => {req.rawbody = attendre req .Rawbody; suivant ();}); après le middleware de Bodyparser



0
votes

La meilleure solution que j'ai trouvée est ici: https://stackoverflow.com/a/9931478/1768033

Parce que l'utilisation de xxx

a déplacé les bits des fichiers que j'envoie dans des demandes de données multiformes, de sorte qu'elles n'étaient plus valides.


0 commentaires