Khi tôi sử dụng Express, và mã của tôi là:
app.use(express.bodyParser());
Làm cách nào để nhận được nội dung yêu cầu thô ?
Câu trả lời:
Chỉnh sửa 2: Bản phát hành 1.15.2 của mô-đun phân tích cú pháp nội dung giới thiệu chế độ thô , trả về nội dung dưới dạng Bộ đệm . Theo mặc định, nó cũng tự động xử lý giải nén deflate và gzip. Ví dụ sử dụng:
var bodyParser = require('body-parser');
app.use(bodyParser.raw(options));
app.get(path, function(req, res) {
// req.body is a Buffer object
});
Theo mặc định, options
đối tượng có các tùy chọn mặc định sau:
var options = {
inflate: true,
limit: '100kb',
type: 'application/octet-stream'
};
Nếu bạn muốn trình phân tích cú pháp thô của mình phân tích cú pháp các kiểu MIME khác application/octet-stream
, bạn sẽ cần thay đổi nó tại đây. Nó cũng sẽ hỗ trợ đối sánh ký tự đại diện chẳng hạn như */*
hoặc */application
.
Lưu ý: Câu trả lời sau dành cho các phiên bản trước Express 4, nơi phần mềm trung gian vẫn được đóng gói cùng với khung. Tương đương hiện đại là mô-đun body-parser , phải được cài đặt riêng.
Các rawBody
bất động sản cấp tốc đã từng có, nhưng loại bỏ kể từ phiên bản 1.5.1. Để có được phần thân yêu cầu thô, bạn phải đặt một số phần mềm trung gian trước khi sử dụng bodyParser. Bạn cũng có thể đọc một cuộc thảo luận GitHub về nó tại đây .
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());
Phần mềm trung gian đó sẽ đọc từ luồng dữ liệu thực tế và lưu trữ nó trong thuộc rawBody
tính của yêu cầu. Sau đó, bạn có thể truy cập vào phần thân thô như thế này:
app.post('/', function(req, res) {
// do something with req.rawBody
// use req.body for the parsed body
});
Chỉnh sửa: Có vẻ như phương thức này và bodyParser từ chối cùng tồn tại, bởi vì phương thức này sẽ sử dụng luồng yêu cầu trước phương thức kia, dẫn đến bất kỳ phương thức nào sau giây không bao giờ kích hoạt end
, do đó không bao giờ gọi next()
và treo ứng dụng của bạn.
Giải pháp đơn giản nhất rất có thể sẽ là sửa đổi nguồn của bodyParser, mà bạn sẽ tìm thấy trên dòng 57 của trình phân tích cú pháp JSON của Connect. Đây là những gì phiên bản sửa đổi sẽ trông như thế nào.
var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function() {
req.rawBody = buf;
var first = buf.trim()[0];
...
});
Bạn sẽ tìm thấy tệp tại vị trí này:
/node_modules/express/node_modules/connect/lib/middleware/json.js
.
Tôi có một giải pháp hoạt động tốt với bodyParser, sử dụng verify
callback trong bodyParser. Trong mã này, tôi đang sử dụng nó để lấy sha1 của nội dung và cũng nhận được phần thân thô.
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);
}
}));
Tôi là người mới trong Node.js và express.js (bắt đầu từ hôm qua, theo nghĩa đen!) Vì vậy tôi muốn nghe ý kiến về giải pháp này.
req.rawBody = buf.toString();
và loại bỏ phần còn lại của verify
chức năng, bởi vì đó là tất cả những gì tôi cần và nó hoạt động rất đẹp. Không cần thay đổi mã nguồn bodyParser!
req.rawBody = buf.toString(encoding);
application/json
yêu cầu
Giải pháp này đã làm việc cho tôi:
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: '*/*' }));
Khi tôi sử dụng giải pháp với req.on('data', function(chunk) { });
nó không hoạt động trên phần thân yêu cầu phân đoạn.
Thận trọng với những câu trả lời khác đó vì chúng sẽ không phát đúng với bodyParser nếu bạn đang muốn cũng hỗ trợ json, urlencoded, v.v. Để nó hoạt động với bodyParser, bạn nên điều kiện trình xử lý của mình chỉ đăng ký trên Content-Type
(các) tiêu đề bạn nhé. quan tâm đến, giống như bản thân bodyParser.
Để có được nội dung cơ thể thô của một yêu cầu với Content-Type: "text/plain"
thành req.rawBody
bạn có thể làm:
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'}))
Điều này cũng sẽ làm.
Đây là một biến thể cho câu trả lời của hexacyanide ở trên. Phần mềm trung gian này cũng xử lý sự kiện 'dữ liệu' nhưng không đợi dữ liệu được tiêu thụ trước khi gọi 'tiếp theo'. Bằng cách này, cả middleware và bodyParser này có thể cùng tồn tại, sử dụng luồng song song.
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
next();
});
app.use(express.bodyParser());
Sử dụng body-parser Phân tích cú pháp phần body sẽ như thế nào:
app.use(bodyParser.text());
app.use(bodyParser.urlencoded());
app.use(bodyParser.raw());
app.use(bodyParser.json());
I E. Nếu bạn muốn lấy tệp văn bản thô, hãy chạy .text()
.
Đó là những gì trình phân tích cú pháp cơ thể hiện hỗ trợ