1
TypeError: Cannot call method 'call' of undefined
    at Array.MongooseArray._cast (/Users/bodo/Documents/Repositories/EnabreNode/node_modules/mongoose/lib/types/array.js:78:15)
    at Object.map (native)
    at Array.MongooseArray.push (/Users/bodo/Documents/Repositories/EnabreNode/node_modules/mongoose/lib/types/array.js:187:23)
    at module.exports (/Users/bodo/Documents/Repositories/EnabreNode/accounts/routes/me.js:29:27)
    at callbacks (/Users/bodo/Documents/Repositories/EnabreNode/node_modules/express/lib/router/index.js:160:37)
    at Promise.module.exports (/Users/bodo/Documents/Repositories/EnabreNode/middleware/load_user.js:15:13)
    at Promise.addBack (/Users/bodo/Documents/Repositories/EnabreNode/node_modules/mongoose/lib/promise.js:128:8)
    at Promise.EventEmitter.emit (events.js:96:17)
    at Promise.emit (/Users/bodo/Documents/Repositories/EnabreNode/node_modules/mongoose/lib/promise.js:66:38)
    at Promise.complete (/Users/bodo/Documents/Repositories/EnabreNode/node_modules/mongoose/lib/promise.js:77:20)

私は実際に非常に単純なスキーマを構築したいと考えています:

{
    username: "bodo",
    email: "info@example.com",
    contacts: [{ 
        user: { username: "john", email: "john@google.com" }, 
        messages: [
            { 
                sender: { username: "bodo", email: "info@example.com" },
                receiver: { username: "john", email: "john@google.com" },
                body: "How are you these days?"
            },
            { 
                sender: { username: "john", email: "john@google.com" },                                       
                receiver: { username: "bodo", email: "info@example.com" },
                body: "I am totally fine?"
            } 
        ]
    }]
};

連絡先属性には、実際の連絡先のユーザー オブジェクトを (参照として) 保持する連絡先サブドキュメントが含まれ、後で hasAcceptedContactRequest、contactSince などのメタ データが保持されます。さらに、チャットからのメッセージ サブドキュメントも保存します。これらのメッセージ サブドキュメントには、本文属性としてのメッセージと、その送信者または受信者が含まれています。送信者と受信者は、入力可能な完全なユーザー オブジェクトへの参照です。

理論的にはそれほどです。これらのスキーマを作成しました。

ユーザースキーマ

var Mongoose = require('mongoose');
var ContactSchema = require('./contact');

var UserSchema = new Mongoose.Schema({

    username: { 
        type: String, 
        index: { unique: true, sparse: true }, 
        required: true, lowercase: true, trim: true
    },

    email: {
        type: String,
        index: { unique: true, sparse: true }, 
        required: true, lowercase: true, trim: true
    },

    contacts: [ContactSchema]

});

module.exports = Mongoose.model('User', UserSchema, 'Users');

ContactSchema

var Mongoose = require('mongoose');
var MessageSchema = require('./message');

var ContactSchema = new Mongoose.Schema({

    user: {
        ref: "User",
        type: Mongoose.Schema.Types.ObjectId
    },

    messages: [MessageSchema]

});

module.exports = ContactSchema;

メッセージスキーマ

var MessageSchema = new Mongoose.Schema({

    body: {
        type: String
    },

    sender: {
        ref: "User",
        type: Mongoose.Schema.Types.ObjectId
    },

    receiver: {
        ref: "User",
        type: Mongoose.Schema.Types.ObjectId
    }

});

module.exports = ContactSchema;

それがルートです

app.put('/me', loadUser, function(req, res, next) {
    var user = req.user;
    var body = req.body;

    if (body.contacts) {
        body.contacts.forEach(function(contact) {
            user.contacts.push({ user: contact });
        });
    }

    console.log(req.user);

    user.save(function(err, user) {
        if (err) return next(err);
        res.send(200);
    });
});

解決策: johnyHK が述べたように、ノードのモジュール システムの使用に問題がありました。誤ってスキーマをモデルとしてエクスポートしてしまいました。上記の修正された例が表示されます。したがって、それらは機能するはずです。

4

2 に答える 2

1

スキーマ定義の順序がコード内で同じであると仮定すると、参照されるスキーマが使用時に完全に定義されるように順序を変更する必要があります。

つまり、次のようになります。

  1. MessageSchema
  2. ContactSchema
  3. UserSchema
于 2012-11-17T13:37:30.403 に答える
0

これを試して:

   user : { type: Schema.ObjectId, ref: 'User', index: true }
于 2012-11-17T09:33:23.660 に答える