Node.js虚拟机和字符串串联

Node.js VM and string concatenation

本文关键字:字符串 js 虚拟机 Node      更新时间:2024-03-27

我有一个动态生成的HTML文件,只注释了一个javascript对象。我正在尝试读取该文件,将对象作为字符串取出,并使用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 :]

如果我用正则表达式(即用(/'{/)而不是('{'))运行它,它将在没有错误的情况下执行,但它不会捕获数据。

问题:为什么两者都不起作用?我如何使用VM获得所需的数据


更新:

我接受了下面答案的建议,它删除了错误,并添加了一两个调整。这是更新后的代码:

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,它确实有所需的数据,但末尾有一行空白。这会让VM崩溃吗?如果是,我该如何摆脱它,还是需要更改我的endDataMap

您可能需要添加括号,以便将字符串解释为对象而不是块:

vm.runInNewContext("(" + dataMap + ")", sandbox)

不在表达式中的花括号被视为块。通过将代码放在括号内,可以清楚地表明代码应该是对象文字,而不是块。