在NodeJs进程之间使用npmcaching

我正在编写一个nodejs应用程序,我需要fork主进程(process.fork)。 我只需要一个模块,但是这个模块需要两次。 一个示例代码来说明:

a.js

 var shared = require('./shared'); var cluster = require('cluster'); if(cluster.isMaster){ cluster.fork(); } else { process.exit(0); } 

shared.js

 console.log('Hello world'); module.export = { foo : 'bar' }; 

shared.js中的代码被执行两次。 有没有办法让它执行一次? nodejs中每个线程是否有模块caching?

编辑:在我的情况下, shared包含使用Winston的一些日志loggingconfiguration,并导出一个API来获取日志logging设施。 我不会因为保密原因而发布代码。 为了让代码正常工作,我们决定让需要这个模块的每个线程的响应能力来configuration它。

它被执行一次,主叉一次,这就是执行两次的原因。

如果你只想要执行一次,你可以这样做:

 var cluster = require('cluster'); if (cluster.isMaster) { var shared = require('./shared'); cluster.fork(); } else { process.exit(0); } 

您也可以在shared文件中添加cluster.isMaster检查。

关于你的编辑的补充

处理工作人员日志的最简单方法是让主进程处理它。 我通常通过从工作人员发送消息到主人这样做:

 const cluster = require('cluster'); if (cluster.isMaster) { const worker = cluster.fork(); const pid = worker.process.pid; worker.on('message', function(msg) { switch (msg.type) { case 'uncaughtException': // Handle uncaught exception from worker // Perhaps fork it again? break; case 'console': // Handle console logging from worker // Add winston code here break; } }); } else { process.on("uncaughtException", function (err) { process.send({ type: "uncaughtException", data: { message: err.message, stack: err.stack } }); process.exit(1); }); // Override console console.log = function () { process.send({ type: "console", method: "log", data: [].slice.call(arguments, 0) }); }; console.error = function () { process.send({ type: "console", method: "error", data: [].slice.call(arguments, 0) }); }; console.info = function () { process.send({ type: "console", method: "info", data: [].slice.call(arguments, 0) }); }; console.warn = function () { process.send({ type: "console", method: "warn", data: [].slice.call(arguments, 0) }); }; console.debug = function () { process.send({ type: "console", method: "debug", data: [].slice.call(arguments, 0) }); }; }