รับเนื้อหาไบนารีใน Node.js โดยใช้การร้องขอ


136

ฉันพยายามGETใช้ข้อมูลไบนารีrequestและมีบางอย่างเช่น:

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

แต่bodyมักจะแตกต่างจากที่คาดไว้ไม่กี่ไบต์ หลังจากการตรวจสอบเพิ่มเติมฉันพบว่าrequestสันนิษฐานว่าbodyเป็นสตริงและแทนที่ไบต์ที่ไม่ใช่ Unicode ทั้งหมด

ฉันพยายามที่จะเพิ่ม

encoding: 'binary'

ไปrequestSettingsแต่มันก็ไม่ได้ช่วย

ฉันจะรับข้อมูลไบนารีได้อย่างไร

คำตอบ:


304

ตกลงหลังจากขุดมาหลายครั้งฉันพบว่าrequestSettingsควรมี:

encoding: null

จากนั้นbodyจะเป็นประเภทBufferแทนที่จะเป็นค่าเริ่มต้นซึ่งเป็นสตริง


52
ช่างเป็นฝันร้ายที่ไร้สาระ ฉันใช้เวลา 12 ชั่วโมงในการตามล่าสิ่งนี้ โดยค่าเริ่มต้นโมดูลคำขอโหนดจะถือว่าข้อมูลขาเข้าในเนื้อหาของการตอบกลับเป็น UTF-8 และแปลงลำดับไบต์ที่ไม่ใช่ UTF-8 เป็นอักขระขยะ (แต่เป็น UTF-8 ที่ถูกต้อง) โดยอัตโนมัติ ไม่มีจำนวนการตั้งค่า "mimetype" ฯลฯ ใช้งานได้ (ไม่ใช่ว่าควรจะใช้สำหรับข้อมูลตอบกลับ ) encoding: nullตัวเลือกเดียวที่ใช้งานได้และ - มีเอกสารไม่ดีมากควรมีคำเตือนที่ชัดเจนในเอกสาร Node Request เกี่ยวกับวิธีการ เพื่อดึงข้อมูลไบนารีที่บริสุทธิ์ขอบคุณ!
Dan Nissenbaum

2
@StoyanBerov ฉันดีใจที่คุณพบว่าคำตอบนี้มีประโยชน์ แต่ในช่วง 5 ปีที่ฉันเขียนคำตอบนี้การอ่านแพ็กเกจได้รับการแก้ไขเพื่อเน้นโซลูชันนี้ในหลาย ๆ ที่ นอกจากนี้ขอแนะนำให้ใช้แพ็คเกจที่รองรับ Promises แทนแพ็กเกจนี้
GilZ

@Gilz ขอบคุณสำหรับการอัปเดต! จริงๆแล้วฉันรู้สึกว่าการเข้ารหัสถูกตั้งค่าเป็นโมฆะตามค่าเริ่มต้น นอกจากนี้ปัญหายังเกิดขึ้นที่โปรเจ็กต์เดิมโดยตั้งค่าเป็นเวอร์ชันโหนดเก่าสุดและโทรกลับเท่านั้นทุกที่
Stoyan Berov

0

คำตอบที่ยอมรับไม่ได้ช่วยแก้ปัญหาของฉัน ฉันคิดว่าgzip: trueมันได้ผล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.