как вернуть документы обратно на мой вызов API? - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь вызвать метод get_radar_life_cycle из app.get("/api/radar_cloning, и он выдает ошибку, показанную ниже, ошибка поступает из строки return done(null,documents) как мне вернуть documents обратно на мой вызов API?

МЕТОДЫ: -

let get_cloned_radars = function(documents, done) { 
let complete_radar_list=[]
  for (let i = 0; i < documents.length; i++) {         
    complete_radar_list.push(documents[i]['orgRadar']);
      for (let j = 0; j < documents[i]['clonedRadarsdetailslist'].length; j++) { 
        complete_radar_list.push(documents[i]['clonedRadarsdetailslist'][j]['clonedRadar']);
      }
  }
  data = complete_radar_list 
  return done(null, data)
}

let get_radar_life_cycle = function(data,done) {
   console.log("data after get_radar_life_cycle") 
   console.log(data)
   Radar_life_cycle.find({orgRadar: {$in:data}})
   .then(documents => {
    console.log(documents) --> shows correct data
    });
  return done(null,documents) --> Error is coming from this line
 };

Вызов API:

 app.get("/api/radar_cloning", (req, res, next) => {
   Radar_cloning.find({orgRadar: {$in:req.query.params.split(',')}})
   .then(documents => {
      get_cloned_radars(documents, function(err,data) { 
      if (err) {
        res.json(err);
      if (data!=null){
        console.log(data)
        }//end for data
      }//end of (Err)
    });//get_cloned_radars

      get_radar_life_cycle(data, function(err,radar_life_cycle_data) { 
      if (err) {
        res.json(err);
        console.log(radar_life_cycle_data)
        }//end for radar_life_cycle_data
      }//end of (Err)
  });//end of get_radar_life_cycle
});
 });

ОШИБКА: -

(node:10065) UnhandledPromiseRejectionWarning: ReferenceError: documents is not defined

1 Ответ

0 голосов
/ 03 июля 2019

Вы пытаетесь получить доступ к документам за пределами его области видимости, которая находится между { и }.Таким образом, вы не можете получить к нему доступ ниже .then(() => {}).

К счастью, вы предоставляете функцию обратного вызова done(err, radar_life_cycle_data), которую вы можете использовать в любом месте области действия get_radar_life_cycle(documents, done).Даже рамки внутри его сферы.Когда вы вызываете функцию done, то, что вы в основном делаете, это вызываете эту функцию (ну, у нее есть некоторые синтаксические ошибки, поэтому я ее очистил)

function(err,radar_life_cycle_data) { 
    if (err) {
        res.json(err);
        console.log(radar_life_cycle_data)
    }
}//end for radar_life_cycle_data

, которая затем выполняется

Итак, решение:

Переместите готово в область действия .then(() => {}) следующим образом:

let get_radar_life_cycle = function(data,done) {
    console.log("data after get_radar_life_cycle") 
    console.log(data)
    Radar_life_cycle.find({orgRadar: {$in:data}})
    .then(documents => {
        console.log(documents) // --> shows correct data
        done(null,documents) // --> No error coming from this line
    });
};

То же самое относится к data, что не входит в область действияиз get_cloned_radars

app.get("/api/radar_cloning", (req, res, next) => {
    Radar_cloning.find({orgRadar: {$in:req.query.params.split(',')}})
    .then(documents => {
        get_cloned_radars(documents, function(err,data) { 
            if (err) {
                res.json(err);
                if (data!=null) {
                    console.log(data)
                    get_radar_life_cycle(data, function(err,radar_life_cycle_data) { 
                        if (err) {
                            res.json(err);
                            console.log(radar_life_cycle_data)
                         } //end of (Err)
                    }); //end of get_radar_life_cycle
                } //end for data
            } //end of (Err)
    }); //get_cloned_radars
 });

Но так как ваш код не читается, вот очищенная версия:

app.get("/api/radar_cloning", (req, res, next) => {
    const radar_life_cycle_cb = function (err, data) {
        if (err) {
            res.json(err);
            return;
        }
        console.log(data);
    }

    const cloned_radar_cb = function (err, data) {
        if (err) {
            res.json(err);
            return;
        }
        if (data != null) {
            get_radar_life_cycle(data, radar_life_cycle_cb);
        }
    };

    Radar_cloning.find({orgRadar: {$in:req.query.params.split(',')}})
    .then(documents => get_cloned_radars(documents, cloned_radar_cb));
}
...