Javascript 在Ruby(Rails)中评估module.exports
目前,我正在尝试从JS获取Ruby中的Javascript 在Ruby(Rails)中评估module.exports,javascript,ruby-on-rails,ruby,execjs,Javascript,Ruby On Rails,Ruby,Execjs,目前,我正在尝试从JS获取Ruby中的散列格式的东西 我有一个JS模块,看起来像这样 module.exports = { key1: "val", key2: { key3: "val3" } ... } contents.prepend("var module = {exports: {}};\n") context = ExecJS.compile contents context.eval('modu
散列格式的东西
我有一个JS模块,看起来像这样
module.exports = {
key1: "val",
key2: {
key3: "val3"
}
...
}
contents.prepend("var module = {exports: {}};\n")
context = ExecJS.compile contents
context.eval('module.exports').to_hash
这是给我的一个字符串。我知道ExecJS在这里可能会有所帮助,但我不确定将其转换为散列的最佳方式是什么
我现在正试着做类似的事情
module.exports = {
key1: "val",
key2: {
key3: "val3"
}
...
}
contents.prepend("var module = {exports: {}};\n")
context = ExecJS.compile contents
context.eval('module.exports').to_hash
但是,当像上面那样给它一个字符串时,我从JSON gem中得到了一个解析错误。我只是尝试将其放入脚本并运行它:
require 'execjs'
str = <<-JS
// Note, you could just do `var module = {}` here
var module = {exports: {}};
module.exports = {
key1: "val",
key2: {
key3: "val3"
}
}
JS
context = ExecJS.compile str
puts context.eval('module.exports').to_hash
# => {"key1"=>"val", "key2"=>{"key3"=>"val3"}}
使用nodejs my_script.js运行它,然后从Ruby中读取它:
require 'json'
hash = JSON.parse "path/to/output.json"
如果问题是运行时,那么可以使用mini_racer作为ExecJS使用的运行时。仅包括宝石:
gem 'execjs'
gem 'mini_racer'
然后您可以运行:
p ExecJS.runtime
# > #<ExecJS::MiniRacerRuntime:0x00007fc44ea20bd8>
p ExecJS.runtime
# > #
然后首先设置上下文:
require 'execjs'
jscode = <<-JS
module.exports = {
key1: "val",
key2: {
key3: "val3"
}
}
JS
context = ExecJS.compile "var module = {};"
result_hash = context.eval jscode
puts result_hash["key1"]
require'execjs'
jscode=有很多这样的文件需要处理吗?您只需复制粘贴内容并用一些Ruby变量名替换module.exports=
。如果有很多文件,可以进行查找和替换。我想您可以使用Node对它们求值,然后将输出也转储到文件中。@maxpleaner它是更大的文件摄取系统的一部分,所以数量未知。嗯,我可以看到我的源代码在其中一个键的字符串中有一些HTML。我不知道是不是这样。我做了更多的测试,但看起来不是这样。在rails控制台中,我正在读取一个文件。它大约有2000行不同深度的键。我在评论某些行,当我评论到一定数量的行时,它似乎只是工作。。。如果删除这些注释,JSON解析错误将再次出现。我知道如果我不提供源文件的话,一定很难想象出这个问题……是的,只是用注释的方法来缩小问题的范围。需要知道更多的细节来帮助进一步的工作。我确信JSON的长度在某种程度上是错误的。由于我注释了不同的行,似乎在某个特定的限制下,注释哪一行无关紧要,它只是无法解析。当ExecJS尝试计算时,输入的完整JSON看起来确实太长(无论出于何种原因),并且日志在堆栈跟踪中显示了一个不完整的JSON。请参阅我编辑的答案,了解不需要ExecJS的另一种方法。显然JSON文件大小有限制,但这个限制非常大(比如100MB)。