在使用 [script.runInThisContext()][] 或者 [vm.runInThisContext()][] 时,目标代码是在当前的V8全局对象的上下文中执行的。被传入此虚拟机上下文的目标代码会有自己独立的作用域。

    要想用 http 模块搭建一个简易的服务器,被传入的代码必须要么自己执行 require('http'),要么引用一个 http,比如:

    1. 'use strict';
    2. const vm = require('vm');
    3. const code = `
    4. ((require) => {
    5. const http = require('http');
    6. http.createServer((request, response) => {
    7. response.writeHead(200, { 'Content-Type': 'text/plain' });
    8. response.end('你好世界\\n');
    9. }).listen(8124);
    10. console.log('服务器运行在 http://127.0.0.1:8124/');
    11. })`;
    12. vm.runInThisContext(code)(require);

    上述例子中的 require() 和导出它的上下文共享状态。这在运行未经认证的代码时可能会引入风险,比如在不理想的情况下修改上下文中的对象。