2017-03-18 10 views
0

私はJavascript(ES6)を使用して穏やかなAPIを開発しています。以下のコードの場合、私は講師とコースの2つのテーブルを持っています。私は特定の講師が持っているすべてのコースを送ろうとしています。各ブロック外のJavaScriptは実行されません

api.get('/getCourses/:lecturer_id', (req, res) => { 
    let myCourses = []; 
    let send = true; 
    Lecturer.findById(req.params.lecturer_id, (err, lecturer) => { 
     if(err) { 
     res.json({ ok : '0'}); 
     } else { 
     lecturer.courses.forEach(value => { 
      Course.findById(value, (err, course) => { 
      console.log(value); 
      if(err) { 
       res.json({ok : '0'}); 
       send = false; 
      } else { 
       console.log('in else'); 
       console.log(course) 
       myCourses.push(course); 
       console.log(myCourses.length); 
      } 
      console.log(myCourses.length); 
      }); 
      console.log('outside1'); 
     }); 
     console.log('outside'); 
     res.json(myCourses); 
     } 
    }); 
    }); 

ここでは、コンソールの「outside1」と「outside」は表示されません。結果として、 "myCourses"配列は空を返します。私の問題は何か説明できますか?ありがとうございました。

答えて

0

あなたがしたことをやるよりも、私はあなたに約束を使用することをお勧めします。以下のコードを参照してください。それはあなたがやっていることと同じことを非常にきれいでエレガントな方法でやっています。

api.get('/getCourses/:lecturer_id', (req, res) => { 
    let myCourses = []; 
    let send = true; 
    Lecturer.findById(req.params.lecturer_id, (err, lecturer) => { 
     if(err) { 
     res.json({ ok : '0'}); 
     } else { 

     Promise.all(lecturer.courses.map(function(value){ 
      return Course.findById(value).exec(); 
     })).then(function(allCourses){ 
      //allCourses is array of courses 
      res.json(allCourses); 
     }).catch(function(err){ 
      //error happened while fetching courses 
     }) 
     } 
    }); 
    }); 
0

あなたのコードを試してみましたが、うまくいきました。どのようにあなたのモデルを定義しましたか?鉱山は、このように見えた:

// Lecturer 
const mongoose = require('mongoose'); 

const lecturerSchema = new mongoose.Schema({ 
    id: { type: 'ObjectId', unique: true }, 
    courses: [ { type: 'ObjectId', ref: 'Course' } ] 
}); 

const Lecturer = mongoose.model('Lecturer', lecturerSchema); 

module.exports = Lecturer; 

// Course 
const mongoose = require('mongoose'); 

const courseSchema = new mongoose.Schema({ 
    id: { type: 'ObjectId', unique: true } 
}); 

const Course = mongoose.model('Course', courseSchema); 

module.exports = Course; 

いくつかの余分な発言:

  • あなたはどのので、結果を検索取得した場合、実際に
  • チェックを使用する前にCourse.find({ '_id': { $in: lecturer.courses } })
  • 検証:lecturer_idとコースを検索することができますlecturernull
  • で見ることができますMongoose Promises
関連する問題