如何将文件返回给我的API调用?

时间:2019-07-03 19:41:15

标签: node.js mean-stack

我正在尝试从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 :(得分:0)

您正在尝试访问其范围之外的文档,该范围是{}之间的所有内容。因此,您无法在.then(() => {})范围以下访问它。

幸运的是,您正在提供一个名为done(err, radar_life_cycle_data)的回调函数,您可以在get_radar_life_cycle(documents, 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));
}