如何解决在 Ruby (Rails) 中评估 module.exports
目前我想尝试在 Ruby 中从 JS 中获取 Hash
格式的内容。
module.exports = {
key1: "val",key2: {
key3: "val3"
}
...
}
这只是作为一个字符串提供给我的。我知道 ExecJS 在这里可能会有所帮助,但我不确定将其转换为哈希的最佳方法是什么。
我目前正在尝试做这样的事情
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"}}
也许您收到 JSON 解析错误是因为模块包含无法序列化的内容。
这是另一种方法。
制作一个加载模块并将其导出为 JSON 的 JS 文件。
var fs = require('fs');
var hash = require('path/to/my_module.js');
fs.writeFileSync('path/to/output.json',JSON.stringify(hash),'utf8');
使用 nodejs my_script.js
运行它,然后从 Ruby 中读取它:
require 'json'
hash = JSON.parse "path/to/output.json"
,
如果是runtime的问题,可以使用mini_racer作为ExecJS使用的runtime。只包括宝石:
gem 'execjs'
gem 'mini_racer'
然后你可以运行:
p ExecJS.runtime
# > #<ExecJS::MiniRacerRuntime:0x00007fc44ea20bd8>
然后您将首先设置上下文:
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"]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。