【问题标题】:Nodejs: How to set the file name for eval?Nodejs:如何为ev​​al设置文件名?
【发布时间】:2014-03-30 13:15:28
【问题描述】:

背景:我为 node.js 开发了一个小模块系统,它从一个单独的源服务器异步加载所有需要的代码,并用eval(code) 编译它。我的问题是,对于此类“eval-ed”代码中的所有运行时错误,堆栈跟踪将 <anonymous> 显示为文件名 --- 我无法区分引用了哪个代码段。

我的问题:有没有办法为 eval 设置文件名,以便堆栈跟踪显示一些程序定义的字符串而不是 <anonymous>

我当前的(不完美的)解决方案:到目前为止,我将代码写入一个文件并使用require(file) 加载它。这将播下文件名 --- 但这是一个复杂的解决方法。

注意: 通常,运行时错误不会在编译 eval 调用时出现,但稍后会在使用编译后的代码时出现。因此,围绕 eval 的 try/catch 无助于确定哪个代码段失败。

【问题讨论】:

    标签: node.js eval stack-trace


    【解决方案1】:

    最终,V8 引擎的这一新特性将应用到 Node.js:

    Issue 2948: Support //# sourceURL= and //# sourceMappingURL= in v8's parser

    此方法目前适用于浏览器。

    【讨论】:

      【解决方案2】:

      不要使用 eval(永远)。为了您的目的,您可以使用vm modulevm.runInThisContext 或其他)。您可以将文件名作为参数传递。 require 在内部也是如此。

      【讨论】:

      • 非常感谢您的快速回答!
      • “不要使用 eval(永远)。”不要传播这个想法。 eval 可以在不同的情况下使用,但它会让开发人员考虑安全性等等。
      • 这是我的意见,但我是认真的。如果您需要 eval-ish 的东西,请使用 new Function
      • 我讨厌只强调您的“原则”但不回答可能不符合您的原则但在您从未想过的某些特定实际案例中有用的原始问题的想法,并提出作为答案。
      猜你喜欢
      • 2012-03-22
      • 1970-01-01
      • 2012-04-16
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多