Aksio: Menggunakan dan meneruskan variabel respons ke fungsi rute middleware

Saya memiliki middleware yang diimplementasikan dengan Axios: Ia memanggil 2 atau 3 rute, 2 fungsi rute pertama mengembalikan nilai tunggal dengan fungsi res.locals.someVariable dan next(), misalnya:

exports.getReservierungenByMonth = function(req,res,next) {

        Produkt.aggregate([
            {
                "$unwind":"$DemonstratorWerte"
            },
            {   
                "$match": {"DemonstratorWerte.Demonstrator" : +req.params.demo_id/*, "ProduktReserviert.Status": false*/}
            },

            .......
            {
                "$addFields": { 
                    "Monat": { 
                        "$let":  { 
                            "vars": {  
                                "monthsInStrings": [, "Januar", "Februar", "Maerz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"] 
                            }, 
                            "in": {  
                                "$arrayElemAt": ['$$monthsInStrings','$Monat'] 
                            } 
                        } 
                    } 
                } 
            }
        ]).exec(function(err, prod) {
                if (err) {
                        res.json(err);
                    }

                else {                  
                    res.locals.reservierungen = reservierungenArray;
                    //res.locals.reservierungen = prod;
                    next();
                }
            })//.then((res) => res.json())
        };

kemudian, tautan router ketiga saya dari axios menggunakan variabel res.locals tersebut untuk menanyakan dan mengumpulkan beberapa data, misalnya:

exports.getStornierungenReservierungen = function(req,res,next) {

    stornierungen = res.locals.stornierungen;
    reservierungen = res.locals.reservierungen; 

    Produkt.aggregate([ 
        {
            $project: {
            "Alle": { $concatArrays: [ stornierungen, reservierungen ]}
            }
        },
        {...}

Kemudian, tautan router ketiga saya mengembalikan data gabungan dari 2 nilai res.locals sebelumnya termasuk fungsi rute terakhir:

router.route('/Middleware/sdasdhgrt/:demo_id').get(function(req,res,next) {
    axios.all([
      axios.get(`http://localhost:2323/D/L4C/a/${req.params.demo_id}`),
      axios.get(`http://localhost:23325/D/Ls/b/${req.params.demo_id}`),
      //axios.get(`http://localhost:53355/4Z/L4C/3/${req.params.demo_id}`)--->> needs the res.locals values!
    ])
    .then(axios.spread(function (result1,result2,result3) {
      res.send({result1,result2});
      res.write(JSON.stringify({
        result1, result2, result3
      }));
      //console.log('Result1: ', result1.data);
      //console.log('Result2: ', result2.data);
      //console.log('Result3: ', result3.data);
    })).catch(error => {
      console.log(error);
    }); 
    });

Pertanyaan saya sekarang adalah: Bagaimana cara meneruskan nilai res.locals dari 2 tautan router ke tautan ketiga menggunakan axios? Di Express, saya baru saja melakukan ini dengan menggunakan fungsi next()...


person MMM    schedule 17.09.2018    source sumber


Jawaban (1)


Dalam kode ini:

axios.all([
  axios.get(`http://localhost:2323/D/L4C/a/${req.params.demo_id}`),
  axios.get(`http://localhost:23325/D/Ls/b/${req.params.demo_id}`),
  //axios.get(`http://localhost:53355/4Z/L4C/3/${req.params.demo_id}`)--->> needs the res.locals values!
])

Tidak bisakah Anda menggunakan dua permintaan pertama sebagai bagian dari axios.all() dan kemudian menggunakan .then(callback) untuk membuat permintaan ketiga? Jadi sesuatu seperti:

axios.all([
  axios.get(`http://localhost:2323/D/L4C/a/${req.params.demo_id}`),
  axios.get(`http://localhost:23325/D/Ls/b/${req.params.demo_id}`),
])
.then((done) => { 
 axios.get(`http://localhost:53355/4Z/L4C/3/${req.params.demo_id}`)
 done();
})
.then((done) => {
  //the rest of your code
  done();
})

Sunting:

Sejujurnya, saya juga hanya akan menggunakan async/await seperti ini (mungkin ada beberapa hal yang hilang, saya tidak mengujinya sama sekali, hanya menuliskannya di atas kepala saya):

try {
        let dataToUse = [], promises = [];
        let now = new moment();
        promises.push(axios(`http://localhost:2323/D/L4C/a/${req.params.demo_id}`));
        promises.push(axios(`http://localhost:23325/D/Ls/b/${req.params.demo_id}`));

        const responses = await Promise.all(promises);
        dataToUse = responses.map(response => response.data);
        //make third request with data
        axios.get(`http://localhost:53355/4Z/L4C/3/${dataToUse.parameter}`);

        // Send your data with res.send();
    } catch (e) {
        res.status(400).send({
            //error info
        });
    }

Bersulang,

person Anthony G.    schedule 18.09.2018
comment
hmm ya mungkin, nanti saya bisa meneruskan hasil dari 2 permintaan aksio sebelumnya ke panggilan balik fungsi saya dan kemudian melakukan apa yang saya inginkan. Namun, saya tidak yakin apakah saya bisa memberikan hasil sebagai parameter url seperti ${data...}. Biasanya, saya akan meneruskan data di Node dengan next() dan langsung ke fungsi pengontrol perutean berikutnya dengan panggilan balik dan mengambil nilainya dengan res.locals.someData... Saya tidak dapat menemukan dokumentasi di axios tentang hal yang setara .. biasanya, seseorang meneruskan data di badan permintaan dan bukan di string url atau tidak? - person MMM; 19.09.2018
comment
@MMM Saya tidak yakin saya mengikuti. Itu tergantung pada permintaan/api Anda. Jika Anda membuat permintaan GET, parameter diteruskan melalui URL biasanya dalam bentuk berikut (untuk REST API): /users/{userNumber}. Meskipun, jika itu adalah permintaan POST, maka ya, isi permintaan Anda kemungkinan besar adalah beberapa data JSON. - person Anthony G.; 20.09.2018