Перезагрузите модуль с Node.js require() из триггера наблюдателя

#node.js #require #reload

#node.js #требовать #перезагрузите

Вопрос:

У меня есть index.js который формирует веб-уровень с помощью app.listen() после определения некоторых записей и получения результатов. В нем я настроил watchr на просмотр другого файла .js в папке ./ libs на предмет любых изменений в нем. После изменения я хочу, чтобы он распространял обновление из функции, в которую он экспортирует index.js веб-службы без их перезагрузки.

В 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,
      ...
   };
  

Я ожидаю, что произойдет то, что после того, как я запущу node.js index.js запустив файл с npm, я могу сначала вызвать веб-службу get() и увидеть вывод ‘test123’ на консоль. Затем я хочу изменить ‘test123’ на ‘testAbc’ и сохранить файл, затем, когда я снова вызываю get (), я ожидаю увидеть вывод ‘testAbc’ на консоль. На данный момент я продолжаю видеть ‘test123’ до перезагрузки сервера, чего я хотел бы избежать, если это возможно.

Есть ли способ перезагрузить require() во время выполнения?

Комментарии:

1.Внутри файла, где находится веб-служба, это myObj также переназначается или только в index.js ? Я предполагаю, что ответ «нет» основан на вашем описании.

2. Спасибо, Патрик. У меня была опечатка, которая привела к путанице, приношу свои извинения. Веб-службы находятся в index.js пока. Я обновил приведенный выше код, чтобы лучше отразить то, что происходит в get(). Я использую файл, ссылка на который находится в верхней части index.js (myObj). Затем в рамках каждого вызова веб-службы я создаю уникальный объект каждый раз, когда вызывается веб-служба (thisObj). Как вы указали, я пытаюсь переопределить первый var, myObj, повторно запрашивая его. Я думал, что это автоматически изменит значения для второго (thisObj) при последующем вызове веб-службы, но это не так. Предложения?

3. На самом деле я работал над пакетом npm для выполнения именно того, что вы описали после прочтения вашего вопроса. Примете ли вы ответ в духе вы можете использовать этот пакет, чтобы сделать это за вас , или вы хотите конкретно выяснить, почему ваш подход не работает?

4. Во-первых, я хотел бы понять почему, и спасибо вам! К сожалению, этот конкретный проект предназначен для группы, которая не позволяет вводить чужие пакеты npm, но для будущих целей я бы также хотел проверить ваш npm!

5. Хорошо, я напишу ответ на оба вопроса, когда у меня будет время.