新遗迹破坏延续本地存储上下文
New Relic breaking continuation-local-storage context
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);第行给了我错误。
query_auth0.postTokenInfo()函数调用似乎是中断的地方。这里有几个层次,给你一个关于它的作用的总结可能更简单:
该函数只是将请求构建到auth0,然后通过我们自己的request_handler模块发送。这只是建立在第三方"请求"npm模块之上。request_handler与cls交互以提取request_id,但不设置任何内容。
这个问题似乎发生在请求发出之后(并且成功而没有问题),然而,当我尝试添加返回的配置文件时,我会抛出以下异常:
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)
同样,这个错误只发生在我使用new遗迹模块的时候。否则,代码运行良好。此外,当请求完成并回调时,问题似乎也会发生。
在node.js中使用NewRelic时,有人遇到过类似的问题吗?这些问题至少可以为我指明正确的方向?
对于任何遇到并感兴趣的人。
似乎在需要新遗迹之后,由于某种原因,它会以某种方式影响异步和延续本地存储的交互方式。在需要新遗迹之前没有任何问题。
然而,在网上进一步搜索后,我发现了一些与async和cls问题有关的主题,然而这些问题只是在需要newrelic时才出现的。
简言之,我发现的解决方案是在需要app.js中的newresil之前先需要cls。我不知道为什么这样解决了问题,但它确实解决了。如果任何人对原因有任何额外的反馈,我们将不胜感激。
- 将作用域存储在JSON中
- 使用javascript存储变量的最安全方式
- 当图像转换为本地存储的DataURL时,EXIF被删除
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- 如何有效地将游戏数据存储在URL查询字符串中
- Ember.js-接口状态应该存储在哪里
- 如何解雇“;铁局部存储负载”;事件
- 本地存储中的字符串到字节数组转换
- 从jQuery调用存储在Variable中的函数
- 推荐在JavaScript中执行存储为字符串的函数,而不是使用eval
- 通过另一个php应用程序将我的项目推送到Github存储库中
- 将数据存储在javascript数组中以供进一步使用
- 在页面卸载时写入HTML5 FileSystem API存储
- 加载存储在IndexedDB中的HTML页面
- 在字符串中查找所有图像 src URL 并存储在数组中
- 如何从C#代码背后调用本地存储的javascript函数
- 在ListView中添加JSON数组中存储的图像-ReactNative
- 将数据存储到元素中
- 使用ajax下载与存储名称不同名称的文件
- 新遗迹破坏延续本地存储上下文