在异步调用完成之前显示页面?输出未定义。 Mongoose.js

时间:2017-05-25 23:34:50

标签: javascript node.js mongoose pug

我的活动模型有一个属性,它是对units表中ObjectId的引用。在我看来,该方法工作正常,因为控制台日志记录NSString *filePath; #ifdef DEBUG filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-Debug" ofType:@"plist"]; #else filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-Production" ofType:@"plist"]; #endif FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath]; [FIRApp configureWithOptions:options]; 记录正确的名称,也从不命中catch子句,因此检索名称时没有错误,因此我假设它也被返回。

不幸的是,假设unit.name是一个活动实例,在我的视图中调用activity会返回undefined,我的视图显示为undefined。正确打印所有其他属性:

enter image description here

我的活动模型的架构:

activity.unit_id

以下是我在var activitySchema = new Schema({ name: { type: String, required: true }, description: { type: String, required: true }, pointsPerUnit: { type: Number, required: true }, unit_id: { type: Schema.Types.ObjectId, ref: 'Unit', get: function(unit_id) { Unit.findById(unit_id).then((unit) => { console.log(unit.name) return unit.name }).catch((e) => console.log(e)); } } }); 文件中调用的内容:

.pug

我也明确地将h2 All Activities each activity in activities p= "Name: " + activity.name p= "Description: " + activity.description p= "Points Per Unit of Excersise: " + activity.pointsPerUnit p= "Unit: " + activity.unit_id hr 个查询记录到我的控制台。这是mongoose的执行,这也是正确的:

mongoose

以下是路线的控制器代码:

Mongoose: units.findOne({ _id: ObjectId("592679205a7b0e0c8fe7f47f") }, { fields: {} })
Mongoose: units.findOne({ _id: ObjectId("592679205a7b0e0c8fe7f47f") }, { fields: {} })

在这个问题上花了两个小时没有运气!任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您正尝试使用异步方法在架构中定义“getter”。而不是这样做,你应该在控制器中调用.populate()

活动架构

var activitySchema = new Schema({
    name: {
        type: String, 
        required: true
    },
    description: {
        type: String,
        required: true
    },
    pointsPerUnit: {
        type: Number,
        required: true
    },
    unit_id: {
        type: Schema.Types.ObjectId, 
        ref: 'Unit',
    }
});

控制器代码

/* GET users listing. */
router.get('/new', function(req, res, next) {
    Activity.find({}).populate('unit_id').then((activities) => {
        res.render('activities/new', {activities});
    }); 
});

这可确保在调用模板之前解析Unit中的对象。