Pytanie Node.js Express express.json i express.urlencoded z przesłaniem formularza


Środek programistyczny bodyParser Express (lub Connect) jest oznaczony jako przestarzały i użytkownicy powinni zamiast tego używać:

app.use(connect.urlencoded())
app.use(connect.json())  

Jednak po uruchomieniu przykład z Node.js w działaniuUżywam curl do wypełnienia formularza, zgodnie z sugestią książki:

curl -F entry[title]='Ho ho ho' -F entry[body]='santa loves you' http://abc:123@127.0.0.1:3000/api/entry

To nie działa. req.body nie jest zdefiniowany. Czy czegoś brakuje? Działa dobrze z bodyParser.

EDYCJA: ROZWIĄZANIE od Express 4

Przetwórz json w ten sposób:

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

...

app.use(bodyParser.json());

Przetwarzaj kodowane wenflonem ciało w ten sposób:

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

Wtedy nie ma ostrzeżenia o wycofaniu. Rozszerzony: true (domyślnie) używa modułu qs, a false używa modułu querystring do parsowania ciała.

Nie używaj app.use(bodyParser()), to użycie jest teraz przestarzałe.


21
2018-03-03 09:36


pochodzenie




Odpowiedzi:


bodyParser jest w rzeczywistości składem trzech middleware (zob dokumentacja i odpowiedni kod źródłowy): json, urlencoded i multipart:

  • json analizuje application/json żądać organów
  • urlencoded analizuje x-ww-form-urlencoded żądać organów
  • i multipart analizuje multipart/form-data żądaj organów, którymi jesteś zainteresowany.

Jeśli podasz tylko json i urlencoded middleware, dane formularza nie będą więc analizowane przez żadne oprogramowanie pośredniczące req.body nie zostaną zdefiniowane. Następnie należy dodać oprogramowanie pośrednie, które może analizować dane formularzy, takie jak groźny, busboy lub multiparty (jak podano w connectDokumentacja).

Oto przykład użycia multiparty:

var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
app.use('/url/that/accepts/form-data', multipartMiddleware);
app.post('/url/that/accepts/form-data', function(req, resp) {
    console.log(req.body, req.files);
});

Nie zapominaj, że za pomocą takiego middlewares pozwalasz każdemu na przesłanie plików na serwer: to twoja odpowiedzialność za obsługę (i usuwanie) tych plików.


27
2018-03-03 11:01



Ach .. Powinienem był przeczytać źródło. Dzięki. - huggie
Och, właśnie zauważyłem, że wieloczęściowa jest również przestarzała. - huggie
Możesz zajrzeć do alternatywy, takiej jak busboy lub groźny wtedy :) API nie jest dokładnie taki sam - Paul Mougel
Dodałem rozwiązanie tego pytania. - huggie