Javascript抛出' ReferenceError:require未定义'

时间:2018-03-07 12:35:54

标签: javascript node.js python-3.x requirejs jsonata

我正在使用js2py库在我的Python代码中运行一段Javascript代码。它适用于抛出的所有类型的Javascript代码并处理结果。但是当我遇到一个错误<在Javascript代码中使用了强大的&#39;要求&#39; 关键字。这是我的代码

import js2py

data = '''var jsonata = require('jsonata');

var data = {
  example: [
    {value: 4},
    {value: 7},
    {value: 13}
  ]
};
var expression = jsonata("$sum(example.value)");
var result = expression.evaluate(data);
console.log(result);
'''

data = js2py.eval_js(data)
print(data)

这里 jsonata 是一个javascript库,用于解析通过npm安装的JSON。

以下是我收到的错误

Traceback (most recent call last):
  File "/home/souvik/PycharmProjects/ServiceHandler/Testjs.py", line 67, in <module>
    data = js2py.eval_js(data)
  File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/evaljs.py", line 113, in eval_js
    return e.eval(js)
  File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/evaljs.py", line 182, in eval
    self.execute(code, use_compilation_plan=use_compilation_plan)
  File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/evaljs.py", line 177, in execute
    exec(compiled, self._context)
  File "<EvalJS snippet>", line 2, in <module>
  File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/base.py", line 899, in __call__
    return self.call(self.GlobalObject, args)
  File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/base.py", line 1344, in call
    return Js(self.code(*args))
  File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/host/jseval.py", line 42, in Eval
    executor(py_code)
  File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/host/jseval.py", line 49, in executor
    exec(code, globals())
  File "<string>", line 2, in <module>
  File "/home/souvik/utorapp/lib/python3.5/site-packages/js2py/base.py", line 1079, in get
    raise MakeError('ReferenceError', '%s is not defined' % prop)
js2py.internals.simplex.JsException: ReferenceError: require is not defined

但是,当我将javascript代码放在一个文件中并从命令行运行时,它就可以了。

jstest.js

var jsonata = require("jsonata");

var data = {
  example: [
    {value: 4},
    {value: 7},
    {value: 13}
  ]
};
var expression = jsonata("$sum(example.value)");
var result = expression.evaluate(data); 
console.log(result)

在命令行中

node jstest.js  --> gives 25

现在我对错误进行了一些调查,结果是&#39;要求&#39; 是浏览器要求,不适用于node.js。事实证明,有一种替代方法可以解决这个问题require.js。所以我去了他们的文档,但是我不太清楚如何定义 require 我的Javascript代码。我也将jsonata作为参数传递给 require ,这是一个 .js 文件。如何使用require.js框架来处理jsonata.js文件与示例中给出的函数声明相对吗?我对这个主题的理解可能是错的,但是我需要澄清一下这个问题吗?有什么方法可以使这个工作吗?

注意:我正在服务器端运行代码。

2 个答案:

答案 0 :(得分:2)

请尝试支持npm模块的最新Js2Py。您的代码的问题只是不支持require。请在导入js2py后添加此语句。

from js2py import require

如果你的代码在新添加后工作正常,请告诉我。

答案 1 :(得分:0)

出于安全原因,JS上下文默认不支持require。您可以轻松启用它:

>>> context = js2py.EvalJs(enable_require=True)
>>> context.eval("require('esprima').parse('var a = 1')")

正如Alekhya Satya在回答中提到的那样,您还可以直接导入require并从python上下文中使用它。