【问题标题】:Await returning undefined into the async function (var all_courses is undefined)等待将未定义返回到异步函数中(var all_courses 未定义)
【发布时间】:2018-11-27 00:08:54
【问题描述】:

我正在尝试返回属于某个程序的课程。为此,我使用了 async / await 但它没有返回在异步函数中作为 id 发生的程序课程:

程序控制器

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

请问有人可以帮我吗?

【问题讨论】:

    标签: node.js mongoose async-await


    【解决方案1】:

    当您将回调传递给.exec 时,它不再返回承诺。相反,您可以使用 Promise 进行错误/值处理:

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

    请注意,除非handleError 抛出错误,否则getCoursesByProgram 将始终解析。


    getProgram 也可以是异步函数。您也可以整合错误处理,但如果您想要更通用的错误处理,您将不得不独立捕获错误或以某种方式解析错误消息。

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

    【讨论】:

    • 我通过将 .exec () 更改为 .then () 解决了我的问题,但非常感谢您的回答。我会记住的
    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2022-11-06
    • 2018-05-27
    • 1970-01-01
    • 2020-05-30
    • 2021-04-20
    相关资源
    最近更新 更多