2016-01-20 82 views
0

我在loopbackjs的上下文中使用此代碼。 我想覆蓋toJSON方法以便返回不同的數據,具體取決於調用者是否是對象的所有者。javascript:使用原型函數的問題

Model.prototype.toJSON = function() { 
    var current = loopback.getCurrentContext(); 
    var obj = getAllData(this); 
    if (!current) { 
    logger.error("Can't get current context in prototype.toJSON. Ignoring and returning 'safe' info"); 
    return getSafeData(obj); 
    } 
    var token = current.get("accessToken"); 
    if (!token) { 
    logger.debug("Current context has no token, may be anonymous"); 
    return getSafeData(obj); 
    } 
    this.owner(function(err, owner) { 
    if (err) { 
     logger.error(err); 
     return getSafeData(obj); 
    } 

    if (token.userId == owner.id) { 
     logger.debug(obj); //here the log shows the correct object 
     return obj; 
    } else { 
     return getSafeData(obj); 
    } 
    }); 
} 

var getAllData = function(obj) { 
    var json = {}; 
    for (var p in obj.__data) { 
    json[p] = obj.__data[p]; 
    } 
    return json; 
} 

var getSafeData = function(obj) { 
    var json = {}; 
    for (var p in obj) { 
    if (Model.settings.protected.indexOf(p) >= 0) continue; 
    json[p] = obj[p]; 
    } 
    return json; 
} 

我的問題是,當令牌不存在(anonoymous調用),代碼不進入異步owner功能,getSafeData(obj)被調用,在前端返回完整的對象。

但是,無論何時調用this.owner異步方法,在前端我都會得到「無內容」。但是,在返回之前,所有者檢查之後,記錄器調試輸出會顯示完整的對象。

我不知道爲什麼。任何想法? this上的異步電話會成爲問題嗎?

+0

寫「無內容」的代碼在哪裏? – thefourtheye

+0

是的,確切地說,調用'this.owner'函數的結果是什麼'this.owner'函數返回=不是this.owner中調用的異步函數返回 –

+0

@JaromandaX我不明白。不會在'this.owner()'裏面的return語句,例如'return obj',也可以從'Model.prototye.toJSON'函數返回嗎?如何讓'Model.prototype.toJSON'返回'this.owner'調用的值? – faboolous

回答

0

不幸的是,它讓我感到它不能完成,因爲我不應該改變toJSON接口來接受回調,它可能會在整個框架中使用。

但在這種情況下,我實際上並不需要異步查詢所有者對象。我真正需要的是擁有者的ID。

因此,通過只是在做

if (token.userId == this.ownerId) { 

代替

this.owner(...); 

我得到了我所需要的。