【问题标题】:NodeJS Mongoose - Cannot call method 'toString' of undefinedNodeJS Mongoose - 无法调用未定义的方法“toString”
【发布时间】:2014-01-06 05:29:23
【问题描述】:

我正在尝试将数据库中团队的名称打印到控制台,代码如下:

var Team = require('../schemas/Team').Model;
app.get('/match', function(req, res) {
    var key = 1359407087999; // Team Key
    Team.findByKey(key, function(err, team) {
        util.log(team);
        if (err) {
            util.log("Error occured");
        }
        if (!team) { 
            util.log("The team does not exist");
        } else {
            res.send("Found team: " + team.name);
        }
    });
});

代码成功获取util.log(team) 所在的团队。它将这个打印到控制台:

{
    __v: 0,
    _id: 5106e7ef9afe3a430e000007,
    name: 'Team Name',
    key: 1359407087999 
}

这也适用于将其发送到网页时。

但是当我尝试将团队的名称发送到网页时,我使用 res.send 方法得到以下输出 => Found team: undefined...当我尝试输出 team.name 而不是 team到控制台,我收到错误Cannot call method 'toString' of undefined

这也是我的 Team mongoose 架构:

var Team = new Schema({
    'key' : {
        unique : true,
        type : Number,
        default: getId
    },
    'name' : { type : String,
        validate : [validatePresenceOf, 'Team name is required'],
        index : { unique : true }
    }
});

Team.statics.findByKey = function(key, cb){
    return this.find({'key' : key}, cb);
};

module.exports.Schema = Team;
module.exports.Model = mongoose.model('Team', Team);

展示团队

app.get('/show/team/:key', function(req, res){
    util.log('Serving request for url[GET] ' + req.route.path);
    Team.findByKey(req.params.key, function(err, teamData){
        util.log(teamData[0]);
        if (!err && teamData) {
            teamData = teamData[0];
            res.json({
                'retStatus' : 'success',
                'teamData' : teamData
            });
        } else {
            util.log('Error in fetching Team by key : ' + req.params.key);
            res.json({
                'retStatus' : 'failure',
                'msg' : 'Error in fetching Team by key ' + req.params.key
            });
        }
    });
});

【问题讨论】:

    标签: javascript mongodb mongoose


    【解决方案1】:

    名称是唯一的,因此您应该使用findOne 而不是find

    Team.statics.findByKey = function(key, cb){
      return this.findOne({'key' : key}, cb);
    };
    

    【讨论】:

    • 这已经破坏了我在原始帖子中的其他代码,你知道为什么吗?使用 find 它可以工作,但使用 findOne 它现在不起作用......
    • 去掉[0]的两次出现。
    • find 返回一个文档数组(在您的情况下为团队),findOne 返回一个对象。
    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多