gpt4 book ai didi

node.js - 如何在node Js vm中使用readFileSync

转载 作者:搜寻专家 更新时间:2023-10-31 22:33:34 24 4
gpt4 key购买 nike

我正在试验 nodeJs 虚拟机。此代码有效:

服务器.js

    var fs = require('fs');
var vm = require('vm');

var app = fs.readFileSync(__dirname + '/' + 'app.js');
vm.runInThisContext(app);


var http = require('http');

var server = http.createServer(onRequest);
server.listen(8080, '127.0.0.1');

应用程序.js

    function onRequest(req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('Hello Node.js\n');
}

现在,如果我将 app.js 更改为

  function onRequest(req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(fs.readFileSync(__dirname + '/index.html'));
}

它不再工作了:浏览器会打印“此网页不可用”

如何通过某种方式将 fs.readFileSync 绑定(bind)到 onRequest 的本地上下文来使其工作?

最佳答案

虽然 JohnKiller 发布的答案在技术上是正确的,但我想指出一个使用 vm.runInContext 的解决方案,我认为它更可靠。

// app.js
var fs = require('fs');
module.exports = function onRequest(req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(fs.readFileSync(__dirname + '/index.html'));
}

// server.js
var appFile = __dirname + '/' + 'app.js';
var app = fs.readFileSync(appFile);

var context = vm.createContext({
__filename: appFile,
__dirname: __dirname,
require: require,
module: { exports: {} }
});
context.exports = context.module.exports;

vm.runInContext(app, context, { filename: appFile });
var onRequest = context.module.exports;

var http = require('http');
var server = http.createServer(onRequest);
server.listen(8080, '127.0.0.1');

我看到了以下主要好处:

1) 全局上下文不会被仅由加载的脚本文件使用的其他变量污染。

2) 从外部文件加载的代码是沙箱化的,它不能直接改变调用者的作用域变量。很清楚外部文件有哪些变量可用。

3) 外部文件中的代码是自封装的,不依赖于上下文中提供的任何外部模块。实际上,它是一个普通的 Node.js 文件,可以通过 require('./app.js')

直接加载

关于node.js - 如何在node Js vm中使用readFileSync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29374023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com