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式中的大括号被视为块。 通过将代码放在圆括号中,您可以清楚地知道代码应该是对象字面值,而不是块。