📜  Node.js vm.runInContext() 方法

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

Node.js vm.runInContext() 方法

vm.runInContext() 方法用于编译代码。它在 contextifiedObject 的上下文中运行代码,然后返回输出。此外,运行代码无法访问本地范围,并且contextifiedObject对象之前使用 vm.createContext() 方法进行了上下文化。

句法:

vm.runInContext( code, contextifiedObject, options )

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

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

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

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

示例 1:

// Node.js program to demonstrate the     
// vm.runInContext() method
  
// Including util and vm module
const util = require('util');
const vm = require('vm');
  
// Defining Context object
const contextobj = { count: 8 }
  
// Contextifying stated object
// using createContext method
vm.createContext(contextobj);
  
// Compiling code by using runInContext
// method with its parameter
vm.runInContext('count *= 4;', contextobj, 'file.vm');
  
// Displays output
console.log("The output is: ", contextobj);

输出:

The output is:  { count: 32 }

在这里,输出中的计数为 32,为 (8*4 = 32)。

示例 2:

// Node.js program to demonstrate the     
// vm.runInContext() method
  
// Including util and vm module
const util = require('util');
const vm = require('vm');
  
// Creating object
cobj = {
         name_of_school: 'M.B.V',
         number_of_students: 10
    },
  
// Contexifying object
context = vm.createContext(cobj);
  
// Calling runInContext method
vm.runInContext('number_of_students *= 3;',
             cobj, 'myfile.vm');
  
// Displays object
console.log(cobj);

输出:

{ name_of_school: 'M.B.V', number_of_students: 30 }

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