首页 > 解决方案 > 节点奇怪的堆栈跟踪

问题描述

如果我执行以下代码:

"use strict";

const config = {};
const run = (fn, params) => fn(params);

run(
    params => {
        throw new Error("Simple test!");
    },
    { config }
);

我得到以下堆栈跟踪:

Error: Simple test!
    at run.config.config (C:\test\test.js:10:9)
    at run (C:\test\test.js:6:29)
    at Object.<anonymous> (C:\test\test.js:8:1)
    at Module._compile (internal/modules/cjs/loader.js:1133:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1153:10)
    at Module.load (internal/modules/cjs/loader.js:977:32)
    at Function.Module._load (internal/modules/cjs/loader.js:877:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at internal/main/run_main_module.js:18:47

有正常现象run.config.config还是bug?

标签: javascriptnode.jsv8stack-trace

解决方案


{config}创建一个具有config原始属性的对象config

堆栈似乎是:config来自参数{config}。所以“ run.{config}.config”从run,显然显示为run.config.config

fn如果较早分配,则堆栈跟踪是不同的(因此,何时fn不是匿名的)。

const config = {foo: 1, bar: 2};
const run = (fn, config) => {
  fn(config);
};

const runFn = params => { 
    console.log(`current params: ${JSON.stringify(params)}`); 
    throw new Error("Caught ya'");
}

run(runFn, {config});

带有 fn 参数的 Nodejs 输出作为预定义的命名函数(上面的代码片段):

current params: {"config":{"foo":1,"bar":2}}
[...]\SO65523965.js:8
    throw new Error("Caught ya'");
    ^

Error: Caught ya'
    at runFn ([...]\SO65523965.js:8:11)
    at run ([...]\SO65523965.js:3:3)
    ...

带有内联 fn 参数的 Nodejs 输出:

current params: {"config":{"foo":1,"bar":2}}
[...]\SO65523965.js:8
    throw new Error("Caught ya'");
    ^

Error: Caught ya'
    at run.config.config ([...]\SO65523965.js:13:11)
    at run ([...]\SO65523965.js:3:3)

推荐阅读