Node.js虚拟机和string连接
我有一个dynamic生成的HTML文件,只有一个JavaScript对象注释掉。 我正在尝试读取该文件,将对象作为string取出,并使用VM的runInNewContext()
。 但是我遇到了几个障碍。
下面是我的代码:
我必须阅读的文件:
/* { "userId": ["2897599"], "addressId": ["1287124"] } */
我正在尝试使用的代码:
var startDataMap = body.indexOf('{') , endDataMap = body.indexOf('}') , dataMap = body.substring(startDataMap, endDataMap); var sandbox = {}; try { vm.runInNewContext(dataMap, sandbox) } catch (error) { console.log(error) };
如果我运行它会反弹一个错误: [SyntaxError: Unexpected token :]
如果我运行一个正则expression式(即用(/\{/)
而不是('{')
)它将执行没有错误,但它没有捕获数据。
问题:为什么不能尝试工作,如何使用VM获取我需要的数据?
更新:
我采取了下面的答案的build议,并删除了错误,并添加了一两个调整。 这里是更新的代码:
var startDataMap = body.indexOf('{') , endDataMap = body.indexOf('*/', startDataMap) , dataMap = body.substring(startDataMap, endDataMap); var sandbox = {}; try { vm.runInNewContext( '(' + dataMap + ')', sandbox) } catch (error) { console.log(error) };
它删除错误,但sandbox
仍然是空的。 我检查了dataMap
,它确实有所需的数据,但最后还是有一行空格。 这会抛出虚拟机吗? 如果是这样,我怎么能摆脱它,或者我需要改变我的endDataMap
?
您可能需要添加圆括号,以便将string解释为对象而不是块:
vm.runInNewContext("(" + dataMap + ")", sandbox)
不在expression式中的大括号被视为块。 通过将代码放在圆括号中,您可以清楚地知道代码应该是对象字面值,而不是块。