2016-03-24 7 views
0

Имея проблему с новой реликвией в Node.js. Кажется, что это мешает моей реализации продолжения-локального хранилища, и я имею в виду, что это, похоже, убивает мой контекст cls.Новый реликвий, нарушающий контекст продолжения-локального хранения

Итак, теперь все работает без проблем с моей текущей настройкой. Это только когда я добавляю строку require ("newrelic"); наверху app.js, как они рекомендуют, что проблема возникает.

Ниже приведена конкретная функция, в которой возникает проблема.

function getProfile(req, res, next) { 
    var logger = new log_handler({ "script": __filename, "function": getProfile.name }); 
    var session = cls.getNamespace('session'); 
    var auth = req.headers.authorization.split(" "); 

    var existingProfile = session.get("profile"); 
    if (typeof existingProfile === "object" && existingProfile.hasOwnProperty("federatedId")) { 
    return next(); 
    } 

    query_auth0.postTokenInfo(auth[1], function (err, profile) { 
    if (err) { 
     logger.warn("query_auth0 encountered an error", { error: err.message }); 
     return next(err); 
    } 

    session.set("profile", profile); 
    next(err); 
    }); 
} 

session.get («Профиль») заявление, прежде чем я называю query_auth0 работы и не отдай профиль сеанса (если есть один набор ранее в стеке). Однако session.set («профиль», профиль); строка дает мне ошибку.

Вызов функции query_auth0.postTokenInfo(), где он, кажется, сломается. Там есть несколько слоев, и вам может быть проще дать вам краткое описание того, что он делает:

Функция просто строит запрос на auth0 и затем отправляется через наш собственный модуль request_handler. Это просто построено на стороннем «запросе» модуле npm. Request_handler взаимодействует с cls, чтобы вытащить request_ids, но ничего не устанавливает.

Проблема, кажется, происходит после того, как сделан запрос (и успешно без проблем), однако, когда я пытаюсь добавить профиль, который вернулся, я получаю следующее исключение бросают:

An Uncaught Exception Occurred! 
Error: No context available. ns.run() or ns.bind() must be called first. 
    at Namespace.set (E:\sitesroot\0\node_modules\continuation-local-storage\context.js:27:11) 
    at E:\sitesroot\0\shared\middleware\get_profile.js:45:35 
    at E:\sitesroot\0\shared\query_auth0.js:51:12 
    at E:\sitesroot\0\shared\request_handler.js:51:12 
    at E:\sitesroot\0\node_modules\async\lib\async.js:52:16 
    at Immediate.<anonymous> (E:\sitesroot\0\node_modules\async\lib\async.js:1206:34) 
    at Immediate.wrapped [as _onImmediate] (E:\sitesroot\0\node_modules\newrelic\lib\transaction\tracer\index.js:155:28) 
    at processImmediate [as _immediateCallback] (timers.js:383:17) 

Опять же, это ошибка возникает, когда я использую newrelic module. В противном случае код работает отлично. Кроме того, проблема возникает, когда запрос завершается и перезванивается.

Кто-нибудь сталкивался с подобными проблемами при использовании New Relic в node.js, которые могли бы хотя бы указать мне в правильном направлении?

ответ

0

Для всех, кто сталкивается с этим и заинтересован.

Кажется, что после требования newrelic это каким-то образом повлияет на способ async и продолжения - локальное хранилище по какой-то причине будет взаимодействовать. Проблем не возникало, прежде чем требовать newrelic.

Однако после дальнейшего поиска в Интернете я нашел тему, связанную с проблемами с async и cls, однако эти проблемы возникли только для меня, когда требовалась новая репликация.

Вкратце, решение, которое я нашел, было требовать cls, прежде чем требовать newrelic в app.js. Я не уверен, почему это решило проблемы, но это произошло. Если у кого-то есть дополнительная обратная связь по причинам, это было бы оценено.

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

  • Нет связанных вопросов^_^