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