使用Mongoose时,错误'对象没有方法xxx'

gee*_*ter 6 javascript mongoose mongodb node.js

我正在尝试使用Mongoose将MongoDB与Nodejs连接起来.

我的代码如下.当我尝试通过api/users进行GET/POST时,我得到了

错误


TypeError: Object function model(doc, fields, skipId) {
[08/14 21:28:06 GMT+0800]     if (!(this instanceof model))
[08/14 21:28:06 GMT+0800]       return new model(doc, fields, skipId);
[08/14 21:28:06 GMT+0800]     Model.call(this, doc, fields, skipId);
[08/14 21:28:06 GMT+0800]   } has no method 'list'
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下我做错了什么吗?我不得不将我的代码拆分成不同的文件,因为我有很多功能,我不想把它们搞乱我的app.js或index/routes.js

app.js

//database connection 
mongoose.connect('....');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
 console.log("Conncection Success !");
});

users_module= require('./custom_modules/users.js');

users_module.init_users();
...
    app.get('/api/users',user.list);  // routing code from expressjs 
Run Code Online (Sandbox Code Playgroud)

/custom_modules/users.js

function init_users() {

    userSchema = mongoose.Schema({
        //id: Number,
        usernamename: String,
        hash: String,
        ...

    });

    userSchema.methods.list = list;

    UserModel = mongoose.model('User', userSchema);

}

function list() {
    return UserModel.find(function (err, users) {
        if (!err) {
            return users;
        } else {
            return console.log(err);

        }
    });
});

exports.init_users = init_users;
Run Code Online (Sandbox Code Playgroud)

路线/ user.js的

exports.list = function (req, res){

    var users = UserModel.list();  // <---------- This is the error Line 
    return res.send(users);

}
Run Code Online (Sandbox Code Playgroud)

Wir*_*rie 5

Mongoose中对象的methods属性model用于向模型对象的实例添加函数.因此,在您的代码中,该函数list被添加到实例中UserModel.如果你想要一个static类似的单例函数,那么你可以将它直接添加到UserModel调用返回的对象mongoose.model('UserModel', userModelSchema);:

UserModel.list = list;
Run Code Online (Sandbox Code Playgroud)

现在,您可以调用它来返回所有用户的列表.

请注意,它仍然是一个异步函数.所以,你不能只返回调用函数的结果,因为它通常是空的.find是异步的,所以你的list函数也需要接受一个回调,当回到列表时可以调用它:

UserModel.list(function(list) {
   res.render(list);
});
Run Code Online (Sandbox Code Playgroud)