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