Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Ruby(Rails)中评估module.exports_Javascript_Ruby On Rails_Ruby_Execjs - Fatal编程技术网

Javascript 在Ruby(Rails)中评估module.exports

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获取Ruby中的
散列
格式的东西

我有一个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)。