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

解释

  1. 确保正确引入模型:在 controllers/line.js 中,我们确保引入的是正确的 User 模型。
  2. 使用 .populate():在 Line.findById() 后直接调用 .populate('creator', 'name'),以填充 creator 字段。
  3. 处理错误:在每个回调函数中添加错误处理逻辑,确保错误不会被忽略。
  4. 渲染模板:将 lineuser 传递给模板进行渲染。

通过这些更改,你应该能够解决 TypeError: Object #<Promise> has no method 'populate' 错误,并正确地填充关联的数据。


自己顶一下,求解。

User.findById(...).populate改成Line.findById(...).populate试试。

根据你提供的错误信息 TypeError: Object #<Promise> has no method 'populate',问题在于你尝试在一个 Promise 对象上调用 populate 方法。实际上,populate 方法应该直接在 Mongoose 的模型实例上使用。

你可以修改你的代码如下:

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') // 直接在这里调用 populate 方法
        .exec(function (err, line) {
            if (err) return res.status(500).send(err);

            res.render('lineDetail', {
                title: line.title,
                line: line,
                users: line.creator // 如果需要传递给模板,可以这样处理
            });
        });
};

在这个例子中,populate 方法被直接调用在 Line.findById(id) 返回的查询对象上。这将确保正确地加载引用的数据。

如果还需要从 User 模型获取其他信息,请确保在 Line 模型中正确设置引用,并且在查询时正确使用 populate 方法。

回到顶部