遇到一些问题!
错误是
local:
{ password: '$2a$08$kSflSzcciqWN78nfqAu/4.ZBZaXkqb19bEypeWcuSxg89yPNuijYO',
email: '***@gmail.com' } } has no method 'usersCharacters'
但确实有方法! 我不确定它是否正确出口。据我所知,我这样做的方式类似于用户使用的其他方法,除非在这里似乎不起作用。
user.js模型文件
....
module.exports = mongoose.model('User', UserSchema);
var User = mongoose.model('User', UserSchema);
/* method works :D ! -- not sure if over complicated though! */
UserSchema.methods.usersCharacters = function(email,cb){
User.findOne( {'local.email' : email }).exec(function(err, user){
if (err) console.log("shit");
var _return = [];
user.characters.forEach(function(err, i){
Character.findOne({ "_id" :user.characters[i] }).exec(function(err2, dude){
_return.push(dude);
/* Can't think of a smarter way to return :( */
if ( i == user.characters.length-1)
cb(_return);
});
});
});
};
routes.js
/* This doesn't work! I am wondering how I might be able to return this users characters --
*
* The error is here btw! TypeError: Cannot call method 'usersCharacters' of undefined -- line with character : ****
*/
app.get('/profile', isLoggedIn, function(req, res) {
var mongoose = require('mongoose');
var UserSchema = mongoose.model('User', UserSchema);
console.log(UserSchema);
// ERROR ON THIS LINE! : (
characters : req.user.usersCharacters(req.user.email, function(_characters){
console.log("list of characters: " + _characters);
return _characters;
res.render('profile.ejs', {
user : req.user, // get the user out of session and pass to template
characters : characters
});
这里有一个包含更多模型文件代码的要点:
答案 0 :(得分:1)
在创建UserSchema
模型之后添加到User
的方法,在User
模型实例上无法使用。
所以在创建User
模型之前创建方法:
UserSchema.methods.usersCharacters = function(email,cb){ ... };
var User = mongoose.model('User', UserSchema);
module.exports = User;
在相关说明中,只有第一次调用mongoose.model('User', UserSchema)
才会处理架构以创建'User'
模型。后续调用将忽略UserSchema
参数并返回现有模型。
答案 1 :(得分:0)
JohnnyHK是正确的,创建猫鼬模型对象的顺序为:
var UserSchema = new mongoose.Schema({...});
创建架构属性。UserSchema.methods.usersCharacters = ...
向架构中添加其他功能,就像您所做的一样。var User = mongoose.model('User', UserSchema);
module.exports = User;
导出模型但是,这不是您问题的直接原因。您正在调用名为.usersCharacters()
的对象上的user
。虽然它的键/值对可能与Mongoose文档对象的键/值对相同,但它不是Mongoose文档对象。
相反,它是一个通用Javascript对象。您必须首先使用以下命令在数据库中查找相应的Mongoose文档对象:
User.findOne( {'local.email' : req.user.email } )).exec(function(err, userDoc){
if (err) console.log("shit");
var characters = req.user.usersCharacters(req.user.email, function(_characters){
console.log("list of characters: " + _characters);
return _characters;
});
res.render('profile.ejs', {
user : req.user, // get the user out of session and pass to template
characters : characters
});
});
请注意,传递给req.user
的{{1}}对象将只包含请求中发送的属性,这些属性可能与res.render()
对象中的属性不同。
但是请注意,我目前无法访问使用userDoc
返回的文档的实例方法。如果遇到此问题,可以在这里查看我的主题:Instance methods not defined for Mongoose findOne() query result?