2017-07-27 27 views
0

我想知道是否有一种方法可以从外部文件中运行节点功能,该功能可能会发生变化。从动态外部文件运行Nodejs功能

Main.js

function read_external(){ 
    var external = require('./external.js'); 
    var result = external.result(); 
    console.log(result); 
} 

setInterval(function(){ 
    read_external(); 
},3000); 

External.js(初始)

exports.result = function(){ 
    return "James"; // Case 1 
} 

我现在通过输入节点main.js

代码开始运行后运行该代码,我改External.js到

exports.result = function(){ 
    return "Jack"; // Case 2 
} 

然而,尽管有所改变,它仍然印刷詹姆斯而不是杰克。 有没有一种方法来编写代码,以便在代码更改时执行新函数?

我需要这个,因为我正在构建一个服务,人们可以提供他们自己的脚本作为JS文件,并在服务中调用某个函数时执行,具体取决于谁调用它。

+1

delete require.cache [require.resolve('./ external.js')]可能是您的解决方案吗?刚刚测试并添加了我的评论作为答案。 –

回答

1

您可以在每次调用之前将模块从缓存中删除。

var module = require.resolve('./external.js'); 

function read_external(){ 
    var external = require(module); 
    var result = external.result(); 
    console.log(result); 
} 

setInterval(function(){ 
    delete require.cache[module]; //clear cache 
    read_external(); 
},3000); 
+0

Ahmet CanGüven - 完美的作品!谢谢:) –

+0

@dontknow你好:)只是做了一点重构,请使用最新版本。 –

1

Node.js会将调用缓存到同一个文件,因此不必再次获取它。要将文件看作是新文件,您需要清除require.cache中的缓存。该文件的关键字应为已解析的名称,您可以使用require.resolve()