TypeError:undefined不是Node.js中的函数

时间:2015-07-15 09:47:46

标签: javascript node.js mongoose

在我的群组模型中,我导出一个使用回调传递查询结果的函数。

在我的路由器文件中,在正确需要其他文件后,我正在调用此函数。

那是我的./models/groups.js

var groupSchema = new mongoose.Schema({

[...]

module.exports.getAll =  function(cb) {
    groupSchema.find({}, function(err, groups) {
        if (err) return cb(err)
        cb(null, groups)
    })
}

[...]

module.exports = mongoose.model('Group', groupSchema);

那是我的./routes/groups.js文件。

var Group = require('../models/group')
router.route('/groups')

    .get(function(req, res, next) {
        Group.getAll( function(err, group){
            if (err) res.send(err)
            res.send(group)
        })
    })

[...]

这不起作用,因为每次收到请求时,我都会收到TypeError: undefined is not a function错误。我知道我可以在我的路由器文件上进行查询,但我认为在路由和方法之间分离是更好的做法。

1 个答案:

答案 0 :(得分:1)

在为getAll分配新值时,您将覆盖定义module.exports函数的对象。

你有两个选择:

  1. 使用getAll功能扩展模型,并像今天一样导出 这基本上看起来像:

    var model = mongoose.model('Group', groupSchema);
    model.getAll = function(cb) {
      ...
    };
    module.exports = model;
    

    但那不是很“干净”。

  2. getAll函数旁边的指定属性下导出模型 这基本上是这样的:

    module.exports.getAll = function(cb) {
      ...
    };
    module.exports.model = mongoose.model('Group', groupSchema);
    

    然后在您的路线中,您将拥有:

    var Groups = require('../models/group');
    // Now you have Groups.getAll & Groups.model
    

    整体上更灵活,您可以根据需要导出其他类型/功能/值。