POST Request จะสร้างไฟล์ ตามด้วย GET Request เพื่อดาวน์โหลด

กำลังพยายามทำอะไรบางอย่างที่ดูเหมือนเป็นพื้นฐาน

ฉันต้องการสร้างคำขอ POST ซึ่งฉันจะส่ง JSON ผ่าน JSON เหล่านี้จะถูกสร้างขึ้นเป็นไฟล์ ซึ่งฉันต้องการส่งคืนให้กับผู้ใช้ผ่านการดาวน์โหลด

กรณีการใช้งานนี้คือ ฉันกำลังสร้างแอปพลิเคชันที่ใช้แบบฟอร์มและแปลงเป็น JSON เพื่ออัปโหลดไปยังฐานข้อมูล MongoDB ผู้ใช้สามารถโหลด JSON เหล่านี้ลงในแอปพลิเคชันเพื่อโหลดบันทึกเก่าของตนเป็นเทมเพลตได้

นี่คือวิธีที่ฉันกำลังเข้าใกล้ในตอนนี้:

// Download JSON Previews
var jsondownload = {};

// Grabs the JSON from POST request
app.post('/api/download', function(req, res, next){
    jsondownload = {};
    var json = req.body;
    jsondownload = json;
    res.json(jsondownload);
    next();
});

// Immediately downloads the JSON thereafter
app.get('/api/download', function(req, res){
    res.set({"Content-Disposition":"attachment; filename='test.json'"});
    res.send(jsondownload);
});

วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร?


person Ahmed Haque    schedule 01.12.2015    source แหล่งที่มา
comment
@KevinB ขอบคุณสำหรับข้อมูล ฉันกังวลเกี่ยวกับปัญหาสภาพการแข่งขันนี้เช่นกัน ฉันจะใช้กลยุทธ์ที่คุณแนะนำเพื่อแก้ไขมัน   -  person Ahmed Haque    schedule 01.12.2015
comment
ฉันไม่ค่อยเข้าใจกรณีการใช้งานที่นี่ และด้วยเหตุนี้ ฉันจึงแนะนำไม่ได้ว่าคุณควรปรับเปลี่ยนอย่างไร ตามที่เป็นอยู่ มันจะทำงานได้อย่างถูกต้องสำหรับผู้ใช้คนเดียวเท่านั้น เมื่อผู้ใช้รายที่สองเข้ามามีส่วนร่วม ตัวแปร jsondownload จะถูกแชร์ระหว่างทั้งสอง ซึ่งทำให้เกิดความขัดแย้ง   -  person Kevin B    schedule 01.12.2015


คำตอบ (1)


ไม่มีวิธีใดที่ "ถูกต้อง" ที่จะทำ แต่มีวิธีแก้ปัญหาบางประการดังนี้:

  1. ลบตัวจัดการเส้นทาง GET (และตัวแปร jsondownload) ออกทั้งหมด และตอบสนองทันทีด้วยการตั้งค่า Content-Disposition อย่างเหมาะสม นี่เป็นสิ่งที่ดีกว่าใน 3 ข้อเพราะมันลดโค้ดและทำให้ทุกอย่างง่ายขึ้น

  2. ใช้การเปลี่ยนเส้นทางแบบง่ายในตัวจัดการเส้นทาง POST ของคุณ แทนที่จะตอบกลับด้วย JSON ทันที คุณจะทำ res.redirect('/api/download')

  3. ทำสิ่งที่กำลังทำอยู่ไม่มากก็น้อย แต่ย้ายตรรกะ (res.set() และ res.send()) ไปยังฟังก์ชันแยกต่างหากที่ได้รับการเรียกจากตัวจัดการเส้นทางทั้งสอง

person mscdex    schedule 01.12.2015
comment
ขอบคุณสำหรับการตอบรับ ความหวังของฉันคือตัวเลือก #1 ก็เป็นไปได้เช่นกัน แต่เมื่อฉันพยายามใช้: res.set({'Content-Disposition...) และ res.send(...) ในคำขอ POST - การดาวน์โหลด ไม่ได้ถูกทริกเกอร์ในลักษณะเดียวกับคำขอ GET มันควรจะทำงานเหมือนกันระหว่าง POST และรับหรือไม่ - person Ahmed Haque; 01.12.2015
comment
ดูเหมือนว่ามีคนถามสิ่งที่คล้ายกันและยังไม่มีโชคมากนักในการดาวน์โหลดไฟล์จากคำขอ POST stackoverflow.com/questions/29743395/ - person Ahmed Haque; 01.12.2015
comment
เป็นไปได้อย่างแน่นอน ฉันเคยทำเองมาก่อน (ส่งการตอบกลับไฟล์แนบไปยังคำขอ POST) คุณอาจขาดส่วนหัวเพิ่มเติมหรือบางอย่างขึ้นอยู่กับเบราว์เซอร์ ลองเพิ่มส่วนหัวพิเศษที่แสดงที่นี่ หรือ ที่นี่< /ก>. คุณยังอาจลองแก้ไขพารามิเตอร์ filename เพื่อไม่ให้ใช้เครื่องหมายคำพูดเดี่ยว/คู่ - person mscdex; 01.12.2015