在Node.js中遇到New Relic的问题 它似乎干扰了我的继续本地存储实现,我的意思是它似乎杀死了我的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 );
} );
}
在调用query_auth0之前,session.get(" profile")语句可以正常工作,并且会给我回到会话配置文件(如果堆栈中有一个集合)。但是,session.set(" profile",profile); line给了我错误。
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模块时才会出现此错误。否则代码工作正常。 此外,当请求完成并回调时,问题似乎也会发生。
在node.js中使用New Relic时,有没有人遇到过类似的问题,这可能至少能够指向正确的方向?
答案 0 :(得分:0)
对于遇到这种情况且感兴趣的任何人。
似乎在要求newrelic后,它会以某种方式影响async和continuation-local-storage因某种原因而互动的方式。在要求newrelic之前没有问题。
然而,在进一步在线搜索后,我发现了一些与async和cls问题相关的话题,但是当需要newrelic时,这些问题才出现。
简而言之,我发现的解决方案是在app.js中要求newrelic之前要求cls。我不确定为什么这会解决问题,但确实如此。 如果有人对原因有任何其他反馈,我们将不胜感激。