在使用 [script.runInThisContext()][] 或者 [vm.runInThisContext()][] 时,目标代码是在当前的V8全局对象的上下文中执行的。被传入此虚拟机上下文的目标代码会有自己独立的作用域。
要想用 http 模块搭建一个简易的服务器,被传入的代码必须要么自己执行 require('http'),要么引用一个 http,比如:
'use strict';const vm = require('vm');const code = `((require) => {const http = require('http');http.createServer((request, response) => {response.writeHead(200, { 'Content-Type': 'text/plain' });response.end('你好世界\\n');}).listen(8124);console.log('服务器运行在 http://127.0.0.1:8124/');})`;vm.runInThisContext(code)(require);
上述例子中的 require() 和导出它的上下文共享状态。这在运行未经认证的代码时可能会引入风险,比如在不理想的情况下修改上下文中的对象。
