如果一个入站请求过早关闭,错误跟踪软件就无法捕获 hapi 应用程序的错误
运行时间
ZZ1ZZ
QQ 运行时版本
页:1
模块版本
页:1
QQ 最后一个模块版本没有发行
无回复( N)
用过
哨兵、滚巴、数据狗
- 任何其他有关资料
哨兵、滚巴和DataDog支持在hopi应用程序中的跟踪错误,依靠hopi的请求'error'事件或`onpreresponse'生命周期方法。 见:
- https://GitHub.com/getsentry/sentry-JavaScript/blob/master/packages/node/src/融合/tracing/hapi/index.ts#L67
- https://docs.rollbar.com/docs/nodejs#using-hapi
- https://GitHub.com/DataDog/dd-trace-js/blob/master/packages/datadog-instrumentations/src/hapi.js#L33
你想达到什么目的 或再生的步骤?
以下是一个实例代码,它重复了一个问题,即处理器中发生的错误绕过请求 ' 错误 ' 事件和`预先反应 ' 生命周期方法调用。
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? 从“@hapi/ hapi” 导入 Hapi ; 导入 { setTimeout as sleep } 从“ 节点:timers/ promises ” 导入“ 时点”
Const 服务器 = Hapi. server ({ 端口: 3000, 内置 主机:“本地主机”
- ;
server.events.on ({名:"request", channel: ["error"]]), (request, event, tags) {{请求", 频道: ["错误"], (request, event, matter, tags){ case.log ("[server] 在请求错误时"); // 不调用 ) (中文(简体) ).
服务器.ext("on Preresponse"), async (request, h) {{ control.log ("[server] on PreResponse"); // 未调用 返回请求;
- ;
服务器. route( { 方法:“GET”, 路径 : "/sleep/{seconds}/then-throw-error", 处理器: async (request, h) {{ c. 请求/参数; 用于(让 i = 0; i < 秒; i++) { sleep %s), i + 1); 控制台.log ("[手 处理请求... (睡眠 %s)", i + 1; 等待睡眠(1 000); {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? contable.log ("[手 扔出错误"); 丢出新错误( “ Boom! ”) ; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
- ;
等待服务器. start (); control.log ("[server] 运行于 %s",服务器.info.uri;
尝试{ case.log ("[提 提出请求"); 等待接取( “http://localhost: 3: 00/ sleep/5/then-throw- error”, {信号: 中止Signal.timeout( 1 000) } ); 捕捉(反射){ 如果( error. name QQ “ TimeoutError ”) { controll.log ("[提 已停止等待响应"); 否则 控制台.log(错误); {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
你的结果是什么?
以下是由示例代码产生的输出:
解释
[服务器]运行于http://localhost:3:00
[提 提出请求
[掌 处理一个请求... (睡一觉)
[提 已停止等待响应
[手 处理一个请求... (睡觉2)
[掌 处理一个请求... (睡眠3)
[手]处理一个请求... (睡眠4)
[掌 处理一个请求... (睡觉5)
[掌 丢出错误无论是"server.events.on"({名称:"request",频道: ["error"]),fn"还是"server.ext("onPreResponse",fn)",如果收到的请求过早地被关闭,都不呼叫回调功能. 然而,如果我们增加请求超时,例如`AbortSignal.timeout(10 000)',两个回调功能都会被调用.
-你期望得到什么结果?
我不確定所顯示出出出出出一出出一出一出出一出一出一出一出一出一出一出一出一出一出一出一出一出一出一出一出一出一出一出一出一出一出一出一出一出一出 . . . . . . .
内容来源: hapijs/hapi