Node.js 升级到Nodejs 12.2后的无效分解分配目标异常

Node.js 升级到Nodejs 12.2后的无效分解分配目标异常,node.js,Node.js,我们最近从10.15.3升级到了节点12.2。下面的部分函数在10.15.3中运行良好,但在升级到12.2后开始以不同的方式解析,并抛出“无效的解构分配目标”语法错误 未定义:1(函数(['context'])){ SyntaxError:无效的分解结构分配目标 功能: function recompile(context) { var previous = {values: context.previous}; previous.argnames = p

我们最近从10.15.3升级到了节点12.2。下面的部分函数在10.15.3中运行良好,但在升级到12.2后开始以不同的方式解析,并抛出“无效的解构分配目标”语法错误

未定义:1(函数(['context'])){

SyntaxError:无效的分解结构分配目标

功能:


    function recompile(context) { 

      var previous = {values: context.previous};

      previous.argnames = previous.values.map(function cmpArgNames(_, i) { return 'previous' + i });

      previous.funcalls = previous.values.map(function cmpFunCalls(f, i) {
        var args = (f.length === 1 ? '(recv)' : '(recv, args, context.storage)');
        return previous.argnames[i] + args;
      });

      var future = {values: context.future};

      future.argnames = future.values.map(function(_, i) { return 'future' + i });

      future.funcalls = future.values.map(function(f, i) {
        var args = (f.length === 2 ? '(recv, rval)' : '(recv, args, rval, context.storage)');

        return future.argnames[i] + args;
      });

      var source = require('util').format(
          ' (function(%s) { \n return function(recv, args) {  \n   try{%s;}catch(e){logProbeErrorMessage(e, recv, context.target, true);}   \n  var rval = context.target.apply(recv, args);  \n  try{%s;}catch(e){logProbeErrorMessage(e, recv, context.target, null, true);}   \n  return rval;  \n   };  \n  })  \n' ,
          ['context'].concat(previous.argnames).concat(future.argnames),
          previous.funcalls.join(';\n'), future.funcalls.join(';\n'));

      var args = [context].concat(previous.values).concat(future.values);

      return eval(source).apply(null, args);
    }

下面的函数“源”代码的解析方式不同,并导致错误。



    var source = require('util').format(
          ' (function(%s) { \n return function(recv, args) {  \n   try{%s;}catch(e){logProbeErrorMessage(e, recv, context.target, true);}   \n  var rval = context.target.apply(recv, args);  \n  try{%s;}catch(e){logProbeErrorMessage(e, recv, context.target, null, true);}   \n  return rval;  \n   };  \n  })  \n' ,
          ['context'].concat(previous.argnames).concat(future.argnames),
          previous.funcalls.join(';\n'), future.funcalls.join(';\n'));

以下是源变量的解析字符串:

10.15.3:

(function(context) { 
 return function(recv, args) {  
   try{;}catch(e){logProbeErrorMessage(e, recv, context.target, true);}   
  var rval = context.target.apply(recv, args);  
  try{;}catch(e){logProbeErrorMessage(e, recv, context.target, null, true);}   
  return rval;  
   };  
  }) 
(function([ 'context' ]) { 
 return function(recv, args) {  
   try{;}catch(e){logProbeErrorMessage(e, recv, context.target, true);}   
  var rval = context.target.apply(recv, args);  
  try{;}catch(e){logProbeErrorMessage(e, recv, context.target, null, true);}   
  return rval;  
   };  
  })  
12.2.0:

(function(context) { 
 return function(recv, args) {  
   try{;}catch(e){logProbeErrorMessage(e, recv, context.target, true);}   
  var rval = context.target.apply(recv, args);  
  try{;}catch(e){logProbeErrorMessage(e, recv, context.target, null, true);}   
  return rval;  
   };  
  }) 
(function([ 'context' ]) { 
 return function(recv, args) {  
   try{;}catch(e){logProbeErrorMessage(e, recv, context.target, true);}   
  var rval = context.target.apply(recv, args);  
  try{;}catch(e){logProbeErrorMessage(e, recv, context.target, null, true);}   
  return rval;  
   };  
  })  
我们可以区分带破坏性赋值的
撇号(')
保留在字符串中,这导致了12.2.0中的问题

12.2.0改变了什么?我们如何解决这个问题


我希望在任何节点版本中的输出都是相同的。

基本上,您的问题可以简化为以下内容。
为什么在节点中这样做有效。谢谢Alex。有没有办法跟踪或识别早期版本中的语法是否被弃用或在将来的版本中得到改进。因为如果代码在不同版本之间出现中断,那么处理代码将是一项挑战。@user5189893我想,您混淆了两件事。
util.format()
与语言语法无关,它是一个库。库不断发展,你必须定期检查它的行为。此外,文档中明确指出:
util模块主要是为了支持Node.js自己的内部API的需要。
另一方面,如果你不介意我指出它,你的代码是脆弱的。如果rgnames包含空值?如果您使用的是函数组合符,或者更好的是函数组合符,您将不会遇到此问题。