bodyParser jest przestarzałe express 4

398

Korzystam z express 4.0 i zdaję sobie sprawę, że parser body został wyjęty z rdzenia express, używam zalecanego zamiennika, jednak otrzymuję

body-parser deprecated bodyParser: use individual json/urlencoded middlewares server.js:15:12 body-parser deprecated urlencoded: explicitly specify "extended: true" for extended parsing node_modules/body-parser/index.js:74:29

Gdzie znajdę te domniemane oprogramowanie pośrednie? czy nie powinienem otrzymywać tego błędu?

var express     = require('express');
var server      = express();
var bodyParser  = require('body-parser');
var mongoose    = require('mongoose');
var passport    = require('./config/passport');
var routes      = require('./routes');

mongoose.connect('mongodb://localhost/myapp', function(err) {
    if(err) throw err;
});

server.set('view engine', 'jade');
server.set('views', __dirname + '/views');

server.use(bodyParser()); 
server.use(passport.initialize());

// Application Level Routes
routes(server, passport);

server.use(express.static(__dirname + '/public'));

server.listen(3000);
Melbourne2991
źródło

Odpowiedzi:

730

Oznacza to, że używanie bodyParser() konstruktora jest przestarzałe , począwszy od 19.06.2014.

app.use(bodyParser()); //Now deprecated

Teraz musisz wywoływać metody osobno

app.use(bodyParser.urlencoded());

app.use(bodyParser.json());

I tak dalej.

Jeśli nadal pojawia się ostrzeżenie urlencoded, musisz użyć

app.use(bodyParser.urlencoded({
  extended: true
}));

extendedKlucz obiekt config teraz musi być wyraźnie minęła, ponieważ teraz nie ma wartości domyślnej.

Jeśli używasz Express> = 4.16.0, parser treści został ponownie dodany zgodnie z metodami express.json()i express.urlencoded().

Ben Fortune
źródło
1
@eslammostafa Możesz użyć bodyparsera, po prostu nie możesz wywołać konstruktora. Musisz wywołać każdą indywidualną metodę.
Ben Fortune,
2
@BenFortune dzięki Ben, rozumiem, właśnie martwiłem się o / tmp, ale teraz sprawdziłem ponownie, problem / tmp występuje tylko wtedy, gdy użyliśmy bodyParser do parsowania wieloczęściowych formularzy, andrewkelley.me/post/do-not-use -bodyparser-with-express-js.html Będę używał formidable wtedy dla formularzy wieloczęściowych.
schehata
23
Co ma extendedzrobić?
Camilo Martin
1
wyjaśnienie różnicy byłoby pomocne. Widzę również poniżej, że możesz po prostu użyć obu. Ale dlaczego? Jakie powinieneś wziąć pod uwagę?
Harry Moreno
8
Najlepszym sposobem wytłumaczę rozszerzony prawdą jest to, że nie używając rozszerzonych środków, które curl --data "user[email]=foo&user[password]=bar" localhost:3000/login zostaną odebrane przez serwer w req.bodyjak { user[email]: "foo", ...}natomiast req.bodybędzie {user: {email: "foo", ... }}z extended: true.
reed_de_la_mer
156

Chcesz zero ostrzeżeń ? Użyj tego w ten sposób:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));

Objaśnienie : Domyślna wartość extendedopcji została uznana za przestarzałą, co oznacza, że ​​musisz jawnie przekazać wartość true lub false.

smajl
źródło
1
Korzystam z tego, wciąż otrzymuję komunikat „parser body-przestarzały”. app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true }));
Jeremy Thille,
6
Nie tak to będzie działać. Musisz użyć app.use () osobno dla json i urlencoded
mr-karan
14

W starszych wersjach ekspresu musieliśmy używać:

app.use(express.bodyparser()); 

ponieważ parser body był oprogramowaniem pośrednim między węzłem a ekspresowym. Teraz musimy go używać w następujący sposób:

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
himanshu yadav
źródło
Myślę, że chciałeś powiedzieć „parser ciała był oprogramowaniem pośrednim”? express nie jest oprogramowaniem pośrednim, jak rozumiem
sakhunzai,
9

Jeśli używasz ekspresowego> 4.16, możesz użyć express.json()iexpress.urlencoded()

express.json()I express.urlencoded()middleware, które zostały dodane w celu zapewnienia wsparcia parsowania prośba ciała out-of-the-box. To wykorzystuje expressjs/body-parsermoduł modułu poniżej, więc aplikacje, które obecnie wymagają osobnego modułu, mogą przełączyć się na wbudowane parsery.

Source Express 4.16.0 - Data wydania: 28.09.2017

Z tym,

const bodyParser  = require('body-parser');

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

staje się,

const express = require('express');

app.use(express.urlencoded({ extended: true }));
app.use(express.json());
Sridhar
źródło
8

body-parser to ekspresowe oprogramowanie pośrednie, które odczytuje dane wejściowe formularza i przechowuje je jako obiekt javascript dostępny za pośrednictwem req.body „body-parser” (należy zainstalować npm install --save body-parser) Aby uzyskać więcej informacji, zobacz: https://github.com/expressjs/body -parser

   var bodyParser = require('body-parser');
   app.use(bodyParser.json()); // support json encoded bodies
   app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies

Kiedy extendedjest ustawiony na true, wówczas deflowane (ściśnięte) ciała zostaną napompowane; gdy extendedma wartość false, deflowane ciała są odrzucane.

Parth Raval
źródło
2

Jakie jest Twoje zdanie na temat użycia ekspresowego generatora, który wygeneruje szkielet projektu na początek, without deprecated messagespojawił się w twoim logu

uruchom to polecenie

npm install express-generator -g

Teraz utwórz nową aplikację startową Express.js, wpisując to polecenie w your Node projects folder.

express node-express-app

To polecenie mówi ekspresowi, aby wygenerował nową aplikację Node.js o nazwie node-express-app.

Następnie Go to the newly created project directory, install npm packagesi start the appz użyciem komendy

cd node-express-app && npm install && npm start
Basheer AL-MOMANI
źródło
1

Znalazłem to podczas dodawania

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));

pomaga, czasem to od twojego zapytania zależy, w jaki sposób ekspres go obsługuje.

Na przykład może się zdarzyć, że parametry zostaną przekazane w adresie URL, a nie w treści

W takim przypadku musisz uchwycić zarówno parametry treści, jak i adresu URL i użyć dowolnej z dostępnych opcji (z preferencją dla parametrów treści w poniższym przypadku)

app.route('/echo')
    .all((req,res)=>{
        let pars = (Object.keys(req.body).length > 0)?req.body:req.query;
        res.send(pars);
    });
Ian Mbae
źródło
-1

app.use(bodyParser.urlencoded({extended: true}));

Mam ten sam problem, ale dla mnie to działa. Możesz wypróbować tę rozszerzoną część.

Mehedi Abdullah
źródło