【问题标题】:JINT - Unable to "console.log"JINT - 无法“console.log”
【发布时间】:2014-05-20 12:10:30
【问题描述】:

我是 JINT 的新手,我只是尝试做一些基本的测试来学习一些技巧。我的第一次尝试是在我的数据库中存储一些 javascript,加载它,然后在单元测试中执行它。所以看起来基本上是这样的......

[Fact]
public void can_use_jint_engine() {
    using (var database = DocumentStore()) {
        using (var session = database.OpenSession()) {
            var source = session.Load<Statistic>("statistics/1");

            // join the list of strings into a single script
            var script = String.Join("\n", source.Scripting);

            // this will create the script
            // console.log("this is a test from jint.");
            // 
            var engine = new Jint.Engine();
            // attempt to execute the script
            engine.Execute(script);
        }
    }
}

它不起作用,我收到这个错误,这对我来说完全没有意义,而且我找不到任何文档。

Jint.Runtime.JavaScriptExceptionconsole 未定义在 Jint.Engine.Execute(程序程序)在 Jint.Engine.Execute(字符串源)在 SampleProject.Installers.Instanced.__testing_installer.can_use_jint_engine() 在 _testing_installer.cs:第 318 行

任何人都可以帮助阐明这一点吗?在这一点上我很困惑。

【问题讨论】:

    标签: c# jint


    【解决方案1】:

    对于 JavaScript,我们关心三个实体。主机(浏览器、您的应用程序等)、引擎(在本例中为 JINT)和脚本(在本例中为“console.log(...)”)。

    JavaScript 定义了一堆函数和对象作为语言的一部分,但控制台不是其中之一。按照惯例,浏览器定义了一个可以按照您描述的方式使用的控制台对象。但是,由于您的应用不是浏览器(并且 JINT 本身不会这样做),因此您的命名空间(全局)中没有定义控制台对象。

    您需要做的是添加一个可在 JINT 中访问的 console 对象。您可以在文档中找到如何执行此操作,但这里有一个简单示例,说明如何将日志 function 添加到引擎,以便可以从 JS 代码中使用它(示例取自 github)。

    var engine = new Engine()
            .SetValue("log", new Action<object>(Console.WriteLine))
            ;
    
        engine.Execute(@"
          function hello() { 
            log('Hello World');
          };
    
          hello();
        ");
    

    【讨论】:

    • 是否可以使用匿名函数,而不是给它命名hello?如果是这样,那将如何实现?就像... function() { log('Hello World'); }; - 甚至可以做到吗?还是每个函数都必须有明确的名称?
    • 您可以只使用示例中的脚本,但没有控制台。即:engine.Execute(@" log('Hello World'); ");
    • 嗯,我的意思是——我想将整个函数存储在数据库中,但它需要用函数括号括起来——但是在设计时不会知道“名称”,所以我想使用匿名函数。所以我仍然对此感到困惑。
    • 天哪!我得到了它!我必须用额外的() 来做这件事。所以它看起来像...(function() { /* code */ })();,然后我可以在连接线上调用执行!!!完美!
    猜你喜欢
    • 1970-01-01
    • 2012-07-24
    • 2011-04-11
    • 2010-12-31
    • 2018-11-26
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多