Permintaan POST membuat file, diikuti dengan Permintaan GET untuk mengunduh

Mencoba melakukan sesuatu yang tampaknya mendasar.

Saya ingin membuat permintaan POST yang akan digunakan untuk mengirim JSON. JSON ini akan dibuat menjadi file, yang ingin saya kembalikan ke pengguna melalui unduhan.

Kasus penggunaannya adalah saya sedang membangun aplikasi yang mengambil formulir dan mengubahnya menjadi JSON untuk diunggah ke database MongoDB. Pengguna dapat memuat JSON ini ke dalam aplikasi untuk memuat ulang catatan lama mereka sebagai templat.

Inilah cara saya mendekatinya sampai sekarang:

// 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);
});

Apa cara yang tepat untuk melakukan ini?


person Ahmed Haque    schedule 01.12.2015    source sumber
comment
@KevinB, terima kasih atas masukannya. Saya juga mengkhawatirkan masalah kondisi balapan ini. Saya akan menggunakan strategi yang Anda sarankan untuk menyiasatinya.   -  person Ahmed Haque    schedule 01.12.2015
comment
Saya tidak begitu memahami kasus penggunaan di sini, dan karena itu saya tidak bisa merekomendasikan bagaimana Anda harus memodifikasinya. Karenanya, ini hanya akan berfungsi dengan baik untuk satu pengguna. Setelah pengguna kedua terlibat, variabel jsondownload akan dibagikan di antara keduanya, sehingga menyebabkan konflik.   -  person Kevin B    schedule 01.12.2015


Jawaban (1)


Tidak ada satu cara yang "benar" untuk melakukannya, namun beberapa solusinya meliputi:

  1. Hapus pengendali rute GET (dan variabel jsondownload) sepenuhnya dan segera tanggapi dengan Content-Disposition yang disetel dengan tepat. Ini lebih baik dari ketiganya karena mengurangi kode dan membuat semuanya tetap sederhana.

  2. Gunakan pengalihan sederhana di pengendali rute POST Anda. Daripada langsung merespons dengan JSON, Anda akan melakukan res.redirect('/api/download').

  3. Lakukan kurang lebih apa yang sedang dilakukan, tetapi pindahkan logika (res.set() dan res.send()) ke fungsi terpisah yang dipanggil dari kedua penangan rute.

person mscdex    schedule 01.12.2015
comment
Terima kasih atas tanggapannya. Harapan saya adalah opsi #1 juga dimungkinkan, namun ketika saya mencoba menggunakan: res.set({'Content-Disposition...) dan res.send(...) dalam permintaan POST -- unduhan tidak dipicu dengan cara yang sama seperti permintaan GET. Haruskah cara kerjanya sama antara POST dan get? - person Ahmed Haque; 01.12.2015
comment
Sepertinya seseorang menanyakan hal serupa dan juga tidak beruntung mengunduh file dari permintaan POST stackoverflow.com/questions/29743395/ - person Ahmed Haque; 01.12.2015
comment
Itu pasti mungkin, saya sudah melakukannya sendiri sebelumnya (mengirimkan respons lampiran ke permintaan POST). Anda mungkin kehilangan header tambahan atau sesuatu tergantung pada browser. Coba tambahkan beberapa header tambahan yang ditampilkan di sini atau di sini. Anda juga dapat mencoba memodifikasi parameter filename agar tidak menggunakan tanda kutip tunggal/ganda. - person mscdex; 01.12.2015