2016-01-20 58 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(...); 

我得到了我所需要的。