Axios: การใช้และส่งตัวแปรตอบสนองไปยังฟังก์ชันเส้นทางมิดเดิลแวร์

ฉันมีมิดเดิลแวร์ที่ใช้งานกับ Axios: มันเรียก 2 หรือ 3 เส้นทาง 2 เส้นทางแรกฟังก์ชันส่งคืนค่าเดียวด้วยฟังก์ชัน res.locals.someVariable และถัดไป () เช่น:

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

จากนั้นลิงก์เราเตอร์ตัวที่สามของฉันจาก axios จะใช้ตัวแปร res.locals เหล่านั้นเพื่อสืบค้นและรวบรวมข้อมูลบางอย่าง เช่น:

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

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

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

จากนั้น ลิงก์เราเตอร์ตัวที่สามของฉันส่งคืนข้อมูลที่รวบรวมจากค่า res.locals ก่อนหน้า 2 ค่า รวมถึงฟังก์ชันเส้นทางสุดท้าย:

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

คำถามของฉันตอนนี้คือ: ฉันจะส่งค่า res.locals จากลิงก์เราเตอร์ 2 ตัวไปยังลิงก์ที่สามโดยใช้ axios ได้อย่างไร ใน Express ฉันเพิ่งทำสิ่งนี้โดยใช้ฟังก์ชัน next()...


person MMM    schedule 17.09.2018    source แหล่งที่มา


คำตอบ (1)


ในรหัสนี้:

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!
])

คุณไม่สามารถใช้สองคำขอแรกเป็นส่วนหนึ่งของ axios.all() แล้วใช้ .then(callback) เพื่อสร้างคำขอที่สามไม่ได้หรือ ดังนั้นบางอย่างเช่น:

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

แก้ไข:

จริงๆ แล้วฉันจะใช้ async/await แบบนี้ด้วย (อาจขาดบางอย่างไป ฉันไม่ได้ทดสอบเลย แค่เขียนมันออกมาในหัว):

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

ไชโย

person Anthony G.    schedule 18.09.2018
comment
อืม ใช่ บางที ในตอนนั้นฉันสามารถส่งผลลัพธ์จากคำขอ axios ก่อนหน้า 2 รายการไปยังฟังก์ชันคอลแบ็กของฉัน จากนั้นจึงทำสิ่งที่ฉันต้องการ อย่างไรก็ตาม ฉันไม่แน่ใจว่าฉันสามารถส่งผลลัพธ์เป็นพารามิเตอร์ของ URL เช่น ${data...} ได้หรือไม่ โดยปกติ ฉันจะส่งข้อมูลใน Node ด้วย next() และไปที่ฟังก์ชันตัวควบคุมเส้นทางถัดไปของฉันพร้อมการโทรกลับและดึงค่าด้วย res.locals.someData... ฉันไม่พบเอกสารใน axios เกี่ยวกับสิ่งที่เทียบเท่ากัน .. โดยปกติแล้วจะมีการส่งข้อมูลในเนื้อความของคำขอและไม่อยู่ใน url-string หรือไม่? - person MMM; 19.09.2018
comment
@MMM ฉันไม่แน่ใจว่าฉันติดตาม ขึ้นอยู่กับคำขอ/api ของคุณ หากคุณกำลังส่งคำขอ GET พารามิเตอร์จะถูกส่งผ่าน URL โดยปกติจะอยู่ในรูปแบบต่อไปนี้ (สำหรับ REST API) : /users/{userNumber} แม้ว่าจะเป็นคำขอ POST ก็ใช่ แต่เนื้อหาของคำขอของคุณมักจะเป็นข้อมูล JSON บางส่วน - person Anthony G.; 20.09.2018