Ожидание возврата неопределенного в асинхронную функцию (var all_courses не определено) - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь вернуть курсы, которые принадлежат определенной программе.для этого я использую async / await, но он не возвращает курсы программы, которые произошли как id в асинхронной функции:

Program Controller

function getProgram(req, res){
     var programId = req.params.id;

     Program.findById({'_id': programId}, (err, program)=>{

        if (err) return res.status(500).send({message: 'Petition failed'});

        if (!program) return res.status(404).send({message: 'There is not program to show'});

        getCoursesByProgram(programId).then((value) =>{
            return res.status(200).send({
                program,
                all_courses: value.all_courses
           });
        });
     });
 }

async function getCoursesByProgram(program_id){

     var all_courses = await Course.find({'program': program_id}).exec((err, courses)=>{
         if(err) return handleError(err);       
        return courses;
     });    
       return{
           all_courses: all_courses
     }
 }

Модели

'use strict'

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var CourseSchema = Schema({

   title: String,
   video: String,
   creator: {type: Schema.ObjectId, ref: 'User'},
   program: {type: Schema.ObjectId, ref: 'Program'},
   description: String,
   created_at: String
});
module.exports = mongoose.model('Course', CourseSchema);


'use strict'

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ProgramSchema = Schema({

   title: String,
   creator: {type: Schema.ObjectId, ref: 'User'},
   image: String,
   description: String,
   created_at: String
});

module.exports = mongoose.model('Program', ProgramSchema);

Пожалуйста, кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 26 ноября 2018

Когда вы передаете обратный вызов .exec, он больше не возвращает обещание.Вместо этого вы можете выполнять обработку ошибок / значений с помощью обещаний:

try {
  return { all_courses: await Course.find({'program': program_id}).exec() };
} catch (err) {
  return handleError(err);       
}

Обратите внимание, что getCoursesByProgram всегда разрешится, если handleError не выдаст ошибку.


getProgram canтакже быть асинхронной функцией.Вы также можете консолидировать обработку ошибок, хотя, если вы хотите более обобщенную обработку ошибок, вам придется либо перехватывать ошибки независимо, либо как-то анализировать сообщения об ошибках.

async function getProgram(req, res) {
  try {
    const programId = req.params.id;

    const program = await Program.findById({'_id': programId}).exec();
    if (!program) return res.status(404).send(...);

    const courses = await getCoursesByProgram(programId);
    return res.status(200).send({
      program,
      all_courses: value.all_courses,
    });
  } catch (err) {
    res.status(500).send({ message: 'Petition failed' });
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...