我正在开发一个IDE,使开发人员能够开发express.js应用程序。因此,开发人员可以创建新的快递应用。由于资源消耗至关重要,我不想在单独的流程中运行每个Express应用程序;实际上它们都作为node.js模块在主进程中运行。现在的问题是我不知道开发人员会编写什么代码,例如他们是否使用setInterval之类的函数。让我再解释一下:
假设这是主程序:
'use strict'
const mainApp = require('express')();
require('./userModule.js')();
mainApp.delete('/', function(req, res){
/*
What should I do here to delete the user code?
*/
res.status(202).send('deleted');
});
mainApp.listen(8000, () => console.log('Example app listening on port 8000!'))
这是用户在userModule.js函数中编写的代码:
'use strict'
module.exports = function(){
// code written by user will come below
setInterval(function(){
console.log('hello!!!');
}, 3000);
// code written by user will come above
}
我已经知道以下内容:
1-按照here的说明删除模块缓存。这没有用。
delete require.cache[require.resolve('./userModule.js')];
2-如果ID未知,请按照here解释ClearInterval。我不想清除所有间隔!而且,它只适用于setInterval函数,其他人呢?!!!
如果模块在主进程中运行,那么我无法选择。我是对的吗?
答案 0 :(得分:1)
并且不要忘记他们可以通过分配到global
(global.foo = 42
或类似)来设置全局变量。一旦创建了全局,您就不知道是谁创建了它以及是否应该删除它。
是的,您已经确定无法完全清理节点模块。
绝对,积极地,不要在同一个过程中运行它们。
即使您将它们作为单独的流程生成,除非您绝对信任每一位作者,否则您无法运行他们为您提供的代码。你需要做更多的事情来保护自己(chroot jails,那种事)。为了保护自己,您需要做的事情的完整列表对于SO问题/答案而言过于宽泛。
但基本答案是:是的,你是正确的,加载后你无法完全清理一个Node模块。不要将他们的代码加载到您的流程中。