从观察者触发器中使用Node.js require()重新加载模块

时间:2019-03-04 21:57:48

标签: node.js require reload

我有一个index.js,它在定义一些帖子和获取内容后使用app.listen()构成了一个网络层。在其中,我将监视程序设置为监视./libs文件夹中的另一个.js文件,以了解对其所做的任何更改。进行更改后,我希望它从它导出到index.js Web服务的功能中传播更新,而无需重新启动它们。

在index.js中...


var bodyParser = require('body-parser');
const express = require('express');
var app = express();
var myObjFile = require('./libs/myObjFile.js');
var watchr = require('watchr');

var myWatchPath = process.cwd() + '\\libs\\myObjFile.js';
function myListener (changeTyle, fullPath, currentStat, previousStat) {
try {
   switch(changeType) {
      case 'update':
         delete require.cache[require.resolve('./libs/myObjFile.js');
         //for (const path in require.cache) {
         //   if (path.endsWith('myObjFile.js') {
         //      delete require.cache[require.resolve('./libs/myObjFile.js');
         //   }
         //}
         //myObjFile = {};
         myObjFile = require('./libs/myObjFile.js');
      }
   }
   catch (err) {
      console.log('err watcher: ' + err.message);
   }
function next (err) {
   return err.message;
}
var stalker = watchr.open(myWatchPath , myListener, next);

app.use(function(req, res, next) {
   res.header("Access-Control-Allow-Origin", "*");
   res.header("Access-Control-Allow-Headers", "origin, X-Requested-With, Content-Type, Accept");
   next();
});
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json( {
   extended: try
}));

app.get('/getStuff/', function (req, res) {
   var thisObj = new myObjFile.objCreate('my type', myUUID); 
   thisObj.consoleTest();
})
app.listen(1234);

您可以在watchr函数的中间看到一些我尝试注释掉的内容。

//Now inside myObjFile.js
exports.objCreate = function (type, uuid) {
   ...
   function consoleTest() {
      console.log('test123');
   }
   ...
   return {
      ...
      consoleTest: consoleTest,
      ...
   };

我期望发生的事情是,在使用npm start启动node.js index.js文件之后,我可以首先调用Web服务get()并在控制台上看到“ test123”打印内容。然后,我想将“ test123”更改为“ testABC”,并保存文件,然后当我再次调用get()时,我希望将“ testABC”打印到控制台。现在,在重新启动服务器之前,我仍然会看到“ test123”,如果可能的话,我希望避免这种情况。

是否可以在运行时重新加载require()?

0 个答案:

没有答案