2013-01-13 3 views
3

를 채울 I가 다음 스키마 (커피 스크립트) :는 몽구스는 하나의 가상 필드

adSchema = new mongoose.Schema({ 
    ... 
    user : { type: mongoose.Schema.Types.ObjectId, ref: 'User' } 
    ... 
}, 
{ 
    toObject: { virtuals: true }, 
    toJSON: { virtuals: true } 
}) 

userSchema = new mongoose.Schema({ 
    username : String 
    email : 
    type : String 
    required : true 
    index : 
     unique : true 
    adverts : [{ type: mongoose.Schema.Types.ObjectId, ref: 'Advert' }] 
}, 
{ 
    toObject: { virtuals: true } 
    toJSON: { virtuals: true } 
}) 

userSchema.virtual('screenname').get() -> 
    if this.username? then this.username else this.email.split('@')[0]+'@...' 

그럼 내가 기록의 무리를 얻고 사용자 채우는 시도 :

getAdvertPage = (obj, fn) -> 
    page_size = 10 
    query = 
    tags : obj.tag 
    Advert.count query, (err, count) -> 
    Advert.find(query) 
    .sort(obj.sort) 
    .skip((obj.page-1)*page_size) 
    .limit(page_size) 
    .populate('user', 'screenname') 
    .exec (err, ads) -> 
     ads.lastPage = (obj.page-1)*page_size + page_size >= count 
     fn err, ads 

을하지만 난 단지 원하는 사용자의 screenname과 아무것도 (가상 필드입니다). 그러나이 오류가 발생합니다

Cannot call method 'split' of undefined 

나는 그것이 잘 작동 채우기에 이메일을 포함하지만 나는 클라이언트에게 이메일을 보내하지 않으려면. 가상 필드 만 채울 방법이 없습니까?

답변

4

'screenname'에 대한 가상 getter 내의 'email'및 'username'필드에 대한 의존성이 있으므로 screenname, email 및 username을 채워보십시오.

... 
.populate('user', 'screenname, email, username') 
... 

그런데 이런 상황을 피하기 위해 가상 게터 내에 비즈니스 로직을 구현해서는 안됩니다. 다른 가상을 만드는 것을 고려하십시오.

+0

네, populate에'email'과'username'을 포함하면이 일이 가능하다는 것을 압니다. 그러나 이메일을 클라이언트에게 보내지 않습니다. 결과를 검토하고 클라이언트에게 보내기 전에 이메일을 제거 할 수는 있지만 해킹을 원하지 않습니다. 가상 내부의 비즈니스 로직에 대한 정보를 보내 주셔서 감사합니다. 나는 그것을 살펴볼 것이다 :) – Baldur

+0

그러나이 접근법은 잘 보이지 않는 _id도 채 웁니다. – HarryJs