本篇文章给大家分享的是有关怎么在节点中绑定全局TraceID,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
- <李>
方案1:在调用,retrieveOneSub函数的父函数,即,retrieveOne内,对,paramData进行,解构,输出学生相关信息,但该方案,无法细化日志输出粒度。
李> <李>方案2:修改,retrieveOneSub函数签名,接收,paramData为其参数,该方案,能确保日志输出粒度,但,在调用链很深的情况下,需要给各函数修改函数签的名,使其接收,paramData,颇具工作量,并不太可行。
李>/* * ,*返回获取一份提交的函数 ,* @param {ParamData}, ParamData ,* @param {上下文},,ctx ,* @param {字符串},,id ,*/export async  function retrieveOne (paramData, ctx, id), { {,const subModel },=, paramData.ce; ,const sub_asgn_id =,数量(id); ,//通过,paramData.user 获取,user 相关信息,如,user_id , ,//但无法细化日志输出粒度,除非修改,retrieveOneSub 的签的名, ,//添加,paramData 为其参数。 {,const user_id },=, paramData.user; ,console.log (“$ {user_id}, is trying 用retreive one submission.”); ,//调用了,retrieveOneSub 函数。 ,const sub =, await retrieveOneSub (sub_asgn_id,子模型);=,const submission 接头; ,分配(子,,{,sub_asgn_id }); ,分配(paramData,{提交的不同之处是,sub }); ,return 接头; }/* * *大敌;从数据库获取一份提交 ,* @param {号码},,sub_asgn_id ,* @param {子模型},,模型 ,*/async function  retrieveOneSub (sub_asgn_id,模型),{ ,const (子),=,await model.findById (sub_asgn_id); ,if (!子),{ throw 才能;new  ME.SoftError (ME.NOT_FOUND, & # 39;找不到该提交& # 39;); ,} ,return 接头; }
<强>异步钩子强>
其实,针对以上的问题,我们还可以从节点的异步钩子实验性API方面入手。在节点。js v8。x后,官方提供了可用于,监听异步行为的异步钩子(异步钩子)API的支持。
<强>异步范围强>
异步钩子对每一个(同步或异步)函数提供了一个异步的范围,我们可调用,executionAsyncId方法获取当前函数的异步ID、调用,triggerAsyncId获取当前函数调用者的异步ID。
const asyncHooks =,要求(“async_hooks"); const {executionAsyncId的不同之处是,triggerAsyncId },=, asyncHooks; console.log (“top 水平:$ {executionAsyncId ()}, $ {triggerAsyncId ()}”); const f =,(),=祝辞,{ ,console.log (' f: $ {executionAsyncId ()}, $ {triggerAsyncId ()}”); }; f (); const g =,(),=祝辞,{ ,console.log (“setTimeout: $ {executionAsyncId ()}, $ {triggerAsyncId ()}”); ,setTimeout((),=祝辞,{ console.log才能(“inner setTimeout: $ {executionAsyncId ()}, $ {triggerAsyncId ()}”); ,},0); }; setTimeout (g, 0); setTimeout (g, 0),
在上述代码中,我们使用,setTimeout模拟一个异步调用过程,且在该异步过程中我们调用了处理程序同步函数,我们在每个函数内都输出其对应的异步ID和触发异步ID。执行上述代码后,其运行结果如下。
top 水平:1,0 f: 1, 0 setTimeout:, 7, 1,,,, setTimeout:, 9, 1,,,, inner setTimeout: 11, 7 inner setTimeout: 13, 9
通过上述日志输出,我们得出以下信息:
- <李>
调用同步函数,不会改变其异步ID,如函数f内的异步ID和其调用者的异步ID相同。
李> <李>同一个函数,被不同时刻进行异步调用,会分配至不同的异步ID,如上述代码中函的克数。
李> <强>追踪异步资源强>
正如我们前面所说的,异步钩子可用于追踪异步资源。为了实现此目的,我们需要了解异步钩子的相关API,具体说明参照以下代码中的注释。
const asyncHooks =,要求(“async_hooks");//,创建一个,AsyncHooks 实例。 const hooks =, asyncHooks.createHook ({ ,//对象构造时会触发,init 事件。 ,初始化:函数(asyncId、,类型,triggerId,,资源),{}, ,//在执行回调前会触发,before 事件。 ,:函数(asyncId), {}, ,//在执行回调后会触发,after 事件。 ,后:函数(asyncId), {}, ,//在销毁对象后会触发,destroy 事件。 ,破坏:函数(asyncId), {} });//,允许该实例中对异步函数启用,hooks 。 hooks.enable ();//,关闭对异步资源的追踪。 hooks.disable ();怎么在节点中绑定全局TraceID