6

MongoDB と Nodejs を接続するために Mongoose を使用しようとしています。

私は以下のようなコードを持っています。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'

誰かが私が間違っていることを説明してもらえますか? 多くの関数があり、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 

/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;

ルート/user.js

exports.list = function (req, res){

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

}
4

1 に答える 1

5

Mongoose のオブジェクトのmethodsプロパティは、modelモデル オブジェクトのインスタンスに関数を追加するために使用されます。したがって、コードでは、関数listが のインスタンスに追加されますUserModel。代わりに like シングルトン関数が必要な場合は、 への呼び出しによって返されるオブジェクトにstatic直接追加できます。UserModelmongoose.model('UserModel', userModelSchema);

UserModel.list = list;

これで、それを呼び出してすべてのユーザーのリストを返すことができます。

ただし、これはまだ非同期関数であることに注意してください。したがって、通常は空になるため、関数を呼び出した結果を返すことはできません。findは非同期であるため、list関数は、リストが返されたときに呼び出すことができるコールバックも受け入れる必要があります。

UserModel.list(function(list) {
   res.render(list);
});
于 2013-08-14T15:30:49.813 に答える