📜  Node.js vm.runInNewContext() 方法

📅  最后修改于: 2022-05-13 01:56:51.148000             🧑  作者: Mango

Node.js vm.runInNewContext() 方法

vm.runInNewContext()方法将指定的 contextObject 上下文化,编译编写的代码并在创建的上下文中运行它,然后返回输出。但是,正在运行的代码无法访问本地范围。

句法:

vm.runInNewContext( code, contextObject, options )

参数:此方法接受三个参数,如上所述,如下所述:

  • 代码:它是要编译和运行的 JavaScript 代码。
  • contextObject:这是一个将被上下文化的对象,如果它未定义,则将创建一个新对象。
  • options:它是一个可选参数,返回Object字符串 ,如果是字符串,则定义返回字符串的文件名。
    它包含以下参数:
    1. 文件名:它包含一个字符串,该字符串指定在此脚本生成的堆栈跟踪中使用的文件名。它的默认值为“evalmachine.anonymous”。
    2. lineOffset:它包含一个数字,该数字指定在此脚本生成的堆栈跟踪中显示的行号的偏移量。它的默认值为 0。
    3. columnOffset:它包含一个数字,该数字指定在此脚本生成的堆栈跟踪中显示的列号的偏移量。它的默认值为 0。
    4. displayErrors:它保存一个布尔值,即如果在编译代码时抛出错误并且抛出错误的代码行链接到堆栈跟踪,则为 true。它的默认值为 true。
    5. timeout:它保存一个整数值,指定在结束执行之前执行所述代码所花费的毫秒数。但是,如果执行关闭,则会发生错误,并且此值必须绝对是正整数。
    6. breakOnSigint:它保存一个布尔值。如果它为真,那么一旦提供了SIGINT即 (Ctrl+C),就会立即停止执行。如果执行停止,则会引发错误。它的默认值为 false。
    7. contextName:它包含一个字符串。它是新生成的上下文的人类可读名称。默认情况下,它是“VM 上下文 i”,其中i是生成的上下文的索引,它以数字递增。
    8. contextOrigin:它包含一个字符串。它是等价于最近生成的上下文的起源。此外,来源必须像 URL 一样形成。它的默认值为“。
    9. contextCodeGeneration:它是 Object 类型的。
      它包含以下参数:
      • 字符串:它保存一个布尔值,如果它设置为 false ,那么任何对函数构造函数或 eval 的调用都会抛出一个错误,即EvalError 。它的默认值为真。
      • wasm:它拥有一个布尔值。如果它设置为 false,那么任何编译 WebAssembly 模块的尝试都会抛出错误,即WebAssembly.CompileError 。它的默认值为 true。
    10. cachedData:它拥有一个Buffer、TypedArray 或一个 DataView 。在 V8 的代码缓存数据的帮助下,它提供了一个可选的Buffer 或 TypedArray 或 DataView以供使用提供的源代码。之后, cachedDataRejected的值可以设置为 true 或 false。这取决于 V8 对数据的接收。
    11. producerCachedData:它保存一个布尔值。如果它的 true 和cachedData不再可用,那么 V8 会尝试为代码输出代码缓存数据。如果这完成了,则会生成一个带有 V8 代码缓存数据的缓冲区,然后将其存储在正在返回的vm.Script实例的 cachedData 中。此外, cachedDataProduced值根据代码缓存数据设置为 true 或 false。但是,此选项已弃用,而是使用script.createCachedData()代替。它的默认值为 false。
    12. importModuleDynamically:它拥有一个函数,在调用import()方法时评估此模块时调用该函数。如果未说明此选项,则对 import() 的调用将被拒绝并出现错误。
      它包含以下参数:
      • 说明符:它包含一个字符串。它是传递给 import() 方法的说明符。
      • 模块:它包含vm.Module 。它返回Module Namespace Object 或 vm.Module

返回值:它返回脚本中执行的最后一条语句的结果。

以下示例说明了 Node.js 中vm.runInNewContext() 方法的使用:

示例 1:

// Node.js program to demonstrate the     
// vm.runInNewContext() method
  
// Including util and vm module
const util = require('util');
const vm = require('vm');
  
// Creating contextObject
const obj = {
  portal: 'GeeksforGeeks',
  authors: 30
};
  
// Calling runInNewContext method
// with its parameters
vm.runInNewContext('authors *= 3;', obj);
  
// Displays output
console.log(obj);

输出:

{ portal: 'GeeksforGeeks', authors: 90 }

在这里,输出中的作者为 90,即 (30 * 3 = 90)。

示例 2:

// Node.js program to demonstrate the     
// vm.runInNewContext() method
  
// Including util and vm module
const util = require('util');
const vm = require('vm');
  
// Creating contextObject
const contextobj = {localVar: 20};
  
// Calling runInNewContext method
// with its parameters
var x = vm.runInNewContext('localVar +=(3*3);',
            contextobj, 2, 'myfile.vm');
  
// Displays output
console.log(contextobj);
console.log(x);

输出:

{ localVar: 29 }
29

参考: https://nodejs.org/api/vm.html#vm_vm_runinnewcontext_code_contextobject_options