Nodejs mongoose中的populate方法报错求解
Nodejs mongoose中的populate方法报错求解
直接贴代码:
schemas/line.js
:
var mongoose = require('mongoose')
var Schema = mongoose.Schema;
var ObjectId = Schema.Types.ObjectId;
var LineSchema = new mongoose.Schema({
creator: {type:ObjectId,ref:'User'},
title:String,
desc:String
})
controllers/line.js
:
var mongoose = require('mongoose');
var Line = require('../models/line');
var User = require('../models/user');
exports.detail = function (req, res) {
var id = req.params.id;
Line.findById(id, function (err, line) {
User
.findById(req.session.user._id)
.populate('creator','name')
.exec(function(err,users){
console.log('users:');
console.log(users);
res.render('lineDetail', {
title: line.title,
line: line,
users: users
})
})
})
};
模板jade文件是:
dt 业务名称
dd #{line.title}
dt 创建时间
dd #{line.meta.createAt}
dt 创建人
dd #{line.creator.name}
dt 业务介绍
dd #{line.desc}
报错信息:
/Users/cassie/github-demo/mean/app/controllers/line.js:15
.populate('creator','name')
^
TypeError: Object #<Promise> has no method 'populate'
at Promise.<anonymous> (/Users/cassie/github-demo/mean/app/controllers/line.js:15:14)
at Promise.<anonymous> (/Users/cassie/github-demo/mean/node_modules/mongoose/node_modules/mpromise/lib/promise.js:177:8)
at Promise.emit (events.js:95:17)
at Promise.emit (/Users/cassie/github-demo/mean/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38)
at Promise.fulfill (/Users/cassie/github-demo/mean/node_modules/mongoose/node_modules/mpromise/lib/promise.js:97:20)
at Promise.resolve (/Users/cassie/github-demo/mean/node_modules/mongoose/lib/promise.js:114:23)
at Promise.<anonymous> (/Users/cassie/github-demo/mean/node_modules/mongoose/node_modules/mpromise/lib/promise.js:177:8)
at Promise.emit (events.js:95:17)
at Promise.emit (/Users/cassie/github-demo/mean/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38)
at Promise.fulfill (/Users/cassie/github-demo/mean/node_modules/mongoose/node_modules/mpromise/lib/promise.js:97:20)
不知道哪里错了,求大大解释。
4 回复
根据你提供的错误信息和代码,问题可能出在 User
对象的获取方式上。从错误信息来看,User
对象似乎是一个 Promise,而不是一个 Mongoose Model 实例。这可能是由于某种原因导致 User
没有正确地加载。
为了解决这个问题,我们需要确保在调用 .populate()
方法时,User
是一个有效的 Mongoose Model 实例。我们可以使用 mongoose.model()
来获取正确的模型实例。以下是修改后的代码:
修改后的代码
schemas/user.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new mongoose.Schema({
name: String,
});
module.exports = mongoose.model('User', UserSchema);
controllers/line.js
var mongoose = require('mongoose');
var Line = require('../models/line');
var User = require('../models/user'); // 确保这里引入的是正确的模型
exports.detail = function (req, res) {
var id = req.params.id;
Line.findById(id).populate('creator', 'name').exec(function (err, line) {
if (err) {
console.error(err);
return res.status(500).send('Internal Server Error');
}
User.findById(req.session.user._id, function (err, user) {
if (err) {
console.error(err);
return res.status(500).send('Internal Server Error');
}
res.render('lineDetail', {
title: line.title,
line: line,
user: user
});
});
});
};
解释
- 确保正确引入模型:在
controllers/line.js
中,我们确保引入的是正确的User
模型。 - 使用
.populate()
:在Line.findById()
后直接调用.populate('creator', 'name')
,以填充creator
字段。 - 处理错误:在每个回调函数中添加错误处理逻辑,确保错误不会被忽略。
- 渲染模板:将
line
和user
传递给模板进行渲染。
通过这些更改,你应该能够解决 TypeError: Object #<Promise> has no method 'populate'
错误,并正确地填充关联的数据。
自己顶一下,求解。