Kaip išjungti „Express BodyParser“ failų atsisiuntimui (Node.js)

Atrodo, kad tai turėtų būti gana paprastas klausimas, bet man labai sunku suprasti, kaip tai pasiekti.

Naudoju „Node.js + Express“, kad sukurtume žiniatinklio programą, ir manau, kad „BodyParser“ ryšys, kuris išreiškia daugeliu atvejų, atrodo labai naudingas. Vis dėlto norėčiau turėti išsamesnę prieigą prie kelių puslapių POSTS formos duomenų, kaip jie ateina - turiu perduoti įvesties srautą į kitą serverį ir noriu pirmiausia ne atsisiųsti visą failą.

Tačiau, kadangi aš naudoju „Express BodyParser“, visi failų atsisiuntimai yra analizuojami automatiškai ir yra parsiunčiami ir prieinami naudojant request.files, kol jie niekada nepatenka į mano funkcijas.

Ar yra būdas išjungti „BodyParser“ daugiapartiškiems formatavimo pranešimams, neišjungiant jo visam kitam?

56
02 июля '12 в 17:20 2012-07-02 17:20 Myk yra nustatytas liepos 2 d. 12 val. 17:20 2012-07-02 17:20
@ 6 atsakymai

Kai įvesite programą „ app.use(express.bodyParser()) beveik kiekvienas prašymas bus vykdomas „ bodyParser funkcijomis (kurios bus vykdomos priklausomai nuo Content-Type antraštės).

Numatytasis yra 3 antraštės (AFAIR). Galite įsitikinti, kad šaltiniai yra tikri. Galite (pakartotinai) apibrėžti Content-Type tvarkytojus tokiu būdu:

 var express = require('express'); var bodyParser = express.bodyParser; // redefine handler for Content-Type: multipart/form-data bodyParser.parse('multipart/form-data') = function(req, options, next) { // parse request body your way; example of such action: // https://github.com/senchalabs/connect/blob/master/lib/middleware/multipart.js // for your needs it will probably be this: next(); } 

<h / "> UPD.

„Express 3“ app.use viskas pasikeitė, todėl naudoju atnaujintą kodą iš darbo projekto (turi būti app.use ed ir express.bodyParser() ):

 var connectUtils = require('express/node_modules/connect/lib/utils');  module.exports = function(contentTypes) { contentTypes = Array.isArray(contentTypes) ? contentTypes : [contentTypes]; return function (req, res, next) { if (req._body) return next(); req.body = req.body || {}; if (!connectUtils.hasBody(req)) return next(); if (-1 === contentTypes.indexOf(req.header('content-type'))) return next(); req.setEncoding('utf8'); // Reconsider this line! req._body = true; // Mark as parsed for other body parsers. req.rawBody = ''; req.on('data', function (chunk) { req.rawBody += chunk; }); req.on('end', next); }; }; 

Ir kai kurie pseudokodai, susiję su pradiniu klausimu:

 function disableParserForContentType(req, res, next) { if (req.contentType in options.contentTypes) { req._body = true; next(); } } 
16
04 июля '12 в 18:40 2012-07-04 18:40 atsakymas pateikiamas elmigranto liepos 4 d., 12 val. 18:40 pm 2012-07-04 18:40

Jei reikia naudoti „ express.bodyParser teikiamas funkcijas, bet norite išjungti daugiapartinius / formos duomenis, tai nėra „ express.bodyParser directly . express.bodyParser yra patogumo metodas, express.json tris kitus būdus: express.json , express.urlencoded ir express.multipart .

Todėl vietoj kalbėjimo

 app.use(express.bodyParser()) 

jums tiesiog reikia pasakyti

 app.use(express.json()) .use(express.urlencoded()) 

Tai suteikia jums daugybę kūno rengybos privalumų daugeliui duomenų, leidžiančių sau tvarkyti formatavimo duomenis.

Redaguoti: „ json ir „ urlencoded nebėra susiję su „Express“. Juos teikia atskiras kūno analizės modulis, ir dabar juos naudojate taip:

 bodyParser = require("body-parser") app.use(bodyParser.json()) .use(bodyParser.urlencoded()) 
59
02 июля '12 в 18:47 2012-07-02 18:47 atsakymas duotas Myko liepos 12 d. 12 val. 18:47 2012-07-02 18:47

Jei poreikis analizuoti kūną priklauso tik nuo paties maršruto, paprasčiausias būdas yra naudoti bodyParser kaip maršruto tarpinės programinės įrangos funkciją tik tiems maršrutams, kuriems jis reikalingas, o ne naudoti jį dangtyje:

 var express=require('express'); var app=express.createServer(); app.post('/body', express.bodyParser(), function(req, res) { res.send(typeof(req.body), {'Content-Type': 'text/plain'}); }); app.post('/nobody', function(req, res) { res.send(typeof(req.body), {'Content-Type': 'text/plain'}); }); app.listen(2484); 
27
04 июля '12 в 3:34 2012-07-04 03:34 atsakymą pateikė „ ebohlman“ liepos 4 d., 12 d., 03:34, 2012-07-04 03:34

„Express 3“ ​​viduje galite perduoti „ bodyParser parametrą kaip {defer: true} bodyParser {defer: true} , kuris skubiai išjungia daugiaprocesą ir atskleidžia formatavimo formos objektą kaip req.form. Jūsų kodas gali būti:

 ... app.use(express.bodyParser({defer: true})); ... // your upload handling request app.post('/upload', function(req, res)) { var incomingForm = req.form // it is Formidable form object incomingForm.on('error', function(err){ console.log(error); //handle the error }) incomingForm.on('fileBegin', function(name, file){ // do your things here when upload starts }) incomingForm.on('end', function(){ // do stuff after file upload }); // Main entry for parsing the files // needed to start Formidables activity incomingForm.parse(req, function(err, fields, files){ }) } 

Jei reikia daugiau pagalbos, žr. Https://github.com/felixge/node-formidable

15
27 марта '13 в 19:17 2013-03-27 19:17 atsakymas į „ alekperos“ pateiktas kovo 27 d. 13 val. 19:17 2013-03-27 19:17

Į 3.1.1 punktą susidūriau su panašiomis problemomis ir suradau (ne toks gražus TJO) sprendimą:

išjungti „bodyParser“, jei naudojate kelių dalių / formų duomenis:

 var bodyParser = express.bodyParser(); app.use(function(req,res,next){ if(req.get('content-type').indexOf('multipart/form-data') === 0)return next(); bodyParser(req,res,next); }); 

ir išanalizuoti turinį:

 app.all('/:token?/:collection',function(req,res,next){ if(req.get('content-type').indexOf('multipart/form-data') !== 0)return next(); if(req.method != 'POST'  req.method != 'PUT')return next(); //...use your custom code here }); 

pvz., naudoju mazgo-daugelio partiją, kur naudotojo kodas turėtų atrodyti taip:

  var form = new multiparty.Form(); form.on('file',function(name,file){ //...per file event handling }); form.parse(req, function(err, fields, files) { //...next(); }); 
4
09 апр. Atsakymą pateikė JakubKnejzlik, balandžio 9 d. 2013-04-09 04:54 '13, 4:54, 2013-04-09 04:54

mesti jį prieš app.configure

 delete express.bodyParser.parse['multipart/form-data']; 
1
04 июля '12 в 8:11 2012-07-04 08:11 Atsakymą pateikė jwerre liepos 4 d. 12 val. 2012-07-04 08:11

Peržiūrėkite kitus klausimus apie „ etiketes. „ arba Užduoti klausimą