Kiedy używam Express, a mój kod to:
app.use(express.bodyParser());
Jak uzyskać treść surowego żądania ?
Odpowiedzi:
Edycja 2: Wersja 1.15.2 modułu analizatora treści treści wprowadza tryb surowy , który zwraca treść jako bufor . Domyślnie obsługuje również automatycznie dekompresję deflate i gzip. Przykładowe użycie:
var bodyParser = require('body-parser');
app.use(bodyParser.raw(options));
app.get(path, function(req, res) {
// req.body is a Buffer object
});
Domyślnie options
obiekt ma następujące domyślne opcje:
var options = {
inflate: true,
limit: '100kb',
type: 'application/octet-stream'
};
Jeśli chcesz, aby twój surowy parser parsował inne typy MIME inne niż application/octet-stream
, musisz to zmienić tutaj. Obsługuje również dopasowywanie symboli wieloznacznych, takich jak */*
lub */application
.
Uwaga: następująca odpowiedź dotyczy wersji wcześniejszych niż Express 4, w których oprogramowanie pośredniczące było nadal dołączane do platformy. Współczesnym odpowiednikiem jest moduł parsera treści , który należy zainstalować osobno.
rawBody
Nieruchomość Ekspresowe niegdyś dostępny, ale usunięto od wersji 1.5.1. Aby uzyskać treść surowego żądania, przed użyciem metody bodyParser musisz zainstalować oprogramowanie pośredniczące. Możesz również przeczytać dyskusję na ten temat w serwisie GitHub tutaj .
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
req.on('end', function() {
next();
});
});
app.use(express.bodyParser());
To oprogramowanie pośredniczące odczyta rzeczywisty strumień danych i zapisze go we rawBody
właściwości żądania. Następnie możesz uzyskać dostęp do surowego ciała w następujący sposób:
app.post('/', function(req, res) {
// do something with req.rawBody
// use req.body for the parsed body
});
Edycja: Wygląda na to, że ta metoda i bodyParser odmawiają współistnienia, ponieważ jeden z nich będzie zużywał strumień żądania przed drugim, co prowadzi do tego, który z nich jest drugi, aby nigdy nie uruchamiać end
, a zatem nigdy nie wywoływać next()
i zawieszać aplikacji.
Najprostszym rozwiązaniem byłoby najprawdopodobniej zmodyfikowanie źródła bodyParser, które można znaleźć w linii 57 parsera JSON Connect. Tak wyglądałaby zmodyfikowana wersja.
var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function() {
req.rawBody = buf;
var first = buf.trim()[0];
...
});
Plik można znaleźć w tej lokalizacji:
/node_modules/express/node_modules/connect/lib/middleware/json.js
.
Mam rozwiązanie, które dobrze współgra z bodyParser, używając verify
wywołania zwrotnego w bodyParser. W tym kodzie używam go, aby uzyskać sha1 zawartości, a także uzyskać surowe ciało.
app.use(bodyParser.json({
verify: function(req, res, buf, encoding) {
// sha1 content
var hash = crypto.createHash('sha1');
hash.update(buf);
req.hasha = hash.digest('hex');
console.log("hash", req.hasha);
// get rawBody
req.rawBody = buf.toString();
console.log("rawBody", req.rawBody);
}
}));
Jestem nowy w Node.js i express.js (dosłownie wystartowałem wczoraj!), Więc chciałbym usłyszeć komentarze na temat tego rozwiązania.
req.rawBody = buf.toString();
i wyjąłem resztę z verify
funkcji, ponieważ to było wszystko, czego potrzebowałem, i działało pięknie. Nie ma potrzeby zmiany kodu źródłowego bodyParser!
req.rawBody = buf.toString(encoding);
application/json
żądań
To rozwiązanie zadziałało dla mnie:
var rawBodySaver = function (req, res, buf, encoding) {
if (buf && buf.length) {
req.rawBody = buf.toString(encoding || 'utf8');
}
}
app.use(bodyParser.json({ verify: rawBodySaver }));
app.use(bodyParser.urlencoded({ verify: rawBodySaver, extended: true }));
app.use(bodyParser.raw({ verify: rawBodySaver, type: '*/*' }));
Kiedy używam rozwiązania, req.on('data', function(chunk) { });
które nie działa na podzielonej treści żądania.
UWAŻAJ na te inne odpowiedzi, ponieważ nie będą one działać poprawnie z bodyParser, jeśli chcesz również obsługiwać json, urlencoded itp. Aby sprawić, że będzie działać z bodyParser, powinieneś ustawić program obsługi, aby rejestrował się tylko w Content-Type
nagłówku (ach) zależy, tak jak robi to sam bodyParser.
Aby uzyskać nieprzetworzoną treść żądania za pomocą polecenia Content-Type: "text/plain"
into req.rawBody
, możesz:
app.use(function(req, res, next) {
var contentType = req.headers['content-type'] || ''
, mime = contentType.split(';')[0];
if (mime != 'text/plain') {
return next();
}
var data = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
next();
});
});
app.use(bodyParser.urlencoded({limit: '80mb', extended: true})); app.use(bodyParser.json({limit: '80mb'})); app.use(bodyParser.raw({type: 'application/octet-stream'}))
To też by się przydało.
To jest odmiana odpowiedzi heksacyjanku powyżej. To oprogramowanie pośredniczące obsługuje również zdarzenie „data”, ale nie czeka na wykorzystanie danych przed wywołaniem „next”. W ten sposób zarówno to oprogramowanie pośredniczące, jak i bodyParser mogą współistnieć, jednocześnie zużywając strumień.
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
next();
});
app.use(express.bodyParser());
Użyj parsera treści Przeanalizuj treść z tym, co będzie:
app.use(bodyParser.text());
app.use(bodyParser.urlencoded());
app.use(bodyParser.raw());
app.use(bodyParser.json());
to znaczy. Jeśli masz pobrać surowy plik tekstowy, uruchom .text()
.
To właśnie obsługuje obecnie analizator treści