2016-01-20 5 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

Где код для создания «No content»? – thefourtheye

+0

Да, точно, результат вызова функции 'this.owner' - это функция' this.owner' возвращает = не то, что вызвала функция async внутри this.owner. –

+0

@JaromandaX Я не понимаю. Не будет оператор return внутри 'this.owner()', например. 'return obj', также является возвратом функции' Model.prototye.toJSON'? Как заставить 'Model.prototype.toJSON' вернуть значение вызова' this.owner'? – faboolous

ответ

0

К сожалению, это не может быть сделано, потому что я не должен менять интерфейс toJSON для принятия обратного вызова, вероятно, он используется во всей структуре.

BUT - в этом случае мне не нужно асинхронно запрашивать объект владельца. Мне действительно нужен идентификатор владельца.

Таким образом, просто делая

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

вместо

this.owner(...); 

я получаю то, что мне нужно.

Смежные вопросы