0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Чтобы прояснить, давайте разберем на таком примере :</p>
1
<p>Чтобы прояснить, давайте разберем на таком примере :</p>
2
<p>Вывод ошибки будет таким:</p>
2
<p>Вывод ошибки будет таким:</p>
3
<p>file:///tmp/test1/index.js:5 callUndefinedFunction(); ^ ReferenceError: callUndefinedFunction is not defined at ReadFileContext.func2 [as callback] (file:///tmp/test1/index.js:5:5) at FSReqCallback.readFileAfterOpen [as oncomplete] (node:fs:314:13)</p>
3
<p>file:///tmp/test1/index.js:5 callUndefinedFunction(); ^ ReferenceError: callUndefinedFunction is not defined at ReadFileContext.func2 [as callback] (file:///tmp/test1/index.js:5:5) at FSReqCallback.readFileAfterOpen [as oncomplete] (node:fs:314:13)</p>
4
<p>Стек ошибки показывает на функцию func2(), но в нём нет родительской функции func1() вот эта строка:</p>
4
<p>Стек ошибки показывает на функцию func2(), но в нём нет родительской функции func1() вот эта строка:</p>
5
<p>at ReadFileContext.func2 [as callback] (file:///tmp/test1/index.js:5:5)</p>
5
<p>at ReadFileContext.func2 [as callback] (file:///tmp/test1/index.js:5:5)</p>
6
<p>Дальше стек ошибки указывает на место в библиотечном коде: node:fs:314:13 - это мы уже не смотрим.</p>
6
<p>Дальше стек ошибки указывает на место в библиотечном коде: node:fs:314:13 - это мы уже не смотрим.</p>
7
<p>Теперь рассмотрим такой пример, уже с синхронным кодом:</p>
7
<p>Теперь рассмотрим такой пример, уже с синхронным кодом:</p>
8
<p>Тут просто одна функция вложена в другую. Стек ошибки этого кода будет таким:</p>
8
<p>Тут просто одна функция вложена в другую. Стек ошибки этого кода будет таким:</p>
9
<p>file:///tmp/test1/index-1.js:3 throw Error(); ^ Error at func2 (file:///tmp/test1/index-1.js:3:11) at func1 (file:///tmp/test1/index-1.js:6:3) at file:///tmp/test1/index-1.js:9:1 at ModuleJob.run (node:internal/modules/esm/module_job:198:25) at async Promise.all (index 0) at async ESMLoader.import (node:internal/modules/esm/loader:385:24) at async loadESM (node:internal/process/esm_loader:88:5) at async handleMainPromise (node:internal/modules/run_main:61:12)</p>
9
<p>file:///tmp/test1/index-1.js:3 throw Error(); ^ Error at func2 (file:///tmp/test1/index-1.js:3:11) at func1 (file:///tmp/test1/index-1.js:6:3) at file:///tmp/test1/index-1.js:9:1 at ModuleJob.run (node:internal/modules/esm/module_job:198:25) at async Promise.all (index 0) at async ESMLoader.import (node:internal/modules/esm/loader:385:24) at async loadESM (node:internal/process/esm_loader:88:5) at async handleMainPromise (node:internal/modules/run_main:61:12)</p>
10
<p>В стеке уже указываются обе функции, первые две строки:</p>
10
<p>В стеке уже указываются обе функции, первые две строки:</p>
11
<p>at func2 (file:///tmp/test1/index-1.js:3:11) at func1 (file:///tmp/test1/index-1.js:6:3)</p>
11
<p>at func2 (file:///tmp/test1/index-1.js:3:11) at func1 (file:///tmp/test1/index-1.js:6:3)</p>
12
<p>Дальше идут строки из внутреннего кода ноды. По этому выводу мы видим стек ошибки, где на верхнем уровне стека функция func2(), внутри которой и была ошибка, ниже идёт func1(), внутри которой была вызвана функция func2(). То есть в стеке обе наши функции. В первом же примере в стеке нет функции func1(), там сразу на первом уровне стека идёт ReadFileContext.func2 (это по сути и есть наша функция-колбек func2()). Метод fs.readFile() вызвался, создал новый стек и поместил в этот стек колбек. Именно поэтому в нём нет func1().</p>
12
<p>Дальше идут строки из внутреннего кода ноды. По этому выводу мы видим стек ошибки, где на верхнем уровне стека функция func2(), внутри которой и была ошибка, ниже идёт func1(), внутри которой была вызвана функция func2(). То есть в стеке обе наши функции. В первом же примере в стеке нет функции func1(), там сразу на первом уровне стека идёт ReadFileContext.func2 (это по сути и есть наша функция-колбек func2()). Метод fs.readFile() вызвался, создал новый стек и поместил в этот стек колбек. Именно поэтому в нём нет func1().</p>