Nhận nội dung nhị phân trong Node.js bằng yêu cầu


135

Tôi đã cố gắng GETsử dụng dữ liệu nhị phân requestvà có một cái gì đó như:

var requestSettings = {
    method: 'GET',
    url: url,
};
request(requestSettings, function(error, response, body) {
    // Use body as a binary Buffer
}

Nhưng bodyluôn luôn có một vài byte khác với dự kiến. Sau khi điều tra thêm, tôi phát hiện ra rằng requestgiả định bodylà chuỗi và thay thế tất cả các byte không unicode.

Tôi đã cố gắng thêm

encoding: 'binary'

đến requestSettingsnhưng nó không giúp đỡ.

Làm thế nào tôi có thể nhận được dữ liệu nhị phân?

Câu trả lời:


300

OK, sau khi đào rất nhiều, tôi phát hiện ra rằng requestSettingsnên có:

encoding: null

Và sau đó bodysẽ là loại Buffer, thay vì mặc định, đó là chuỗi.


50
Thật là một cơn ác mộng vô lý. Mất 12 giờ để săn lùng nó. Dường như, mô-đun Node Request, theo mặc định, xử lý dữ liệu đến trong nội dung của phản hồi là UTF-8 và tự động chuyển đổi bất kỳ chuỗi byte không UTF-8 nào thành ký tự rác (nhưng hợp lệ UTF-8). Không có số lượng cài đặt 'mimetype ", v.v. (không phải là dành cho dữ liệu phản hồi ). Đây encoding: nulllà tùy chọn duy nhất hoạt động. Và - tài liệu rất kém. Phải có một cảnh báo rõ ràng trong tài liệu Yêu cầu nút về cách thức để lấy dữ liệu nhị phân thuần túy. Cảm ơn!
Dan Nissenbaum

2
@StoyanBerov, tôi rất vui vì bạn thấy câu trả lời này hữu ích, nhưng trong 5 năm kể từ khi tôi viết câu trả lời này, gói readme đã được sửa để làm nổi bật giải pháp này ở một số nơi. Ngoài ra, tôi đặc biệt khuyên bạn nên sử dụng gói hỗ trợ Lời hứa thay vì gói này.
GilZ

@Gilz, cảm ơn đã cập nhật! Tôi thực sự có ấn tượng rằng mã hóa được đặt thành null theo mặc định. Ngoài ra, vấn đề đã xảy ra tại một dự án cũ, được đặt thành phiên bản nút siêu cũ và chỉ gọi lại ở mọi nơi.
Stoyan Berov

Chạy vào đó một lần nữa - đã không sử dụng điều này trong các thời đại. Mã hóa: null để giải cứu
Pyro

0

Câu trả lời được chấp nhận không giải quyết được vấn đề của tôi. Tôi bằng cách nào đó đã tìm ra rằng gzip: truelàm việc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.