#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. Хорошо, я напишу ответ на оба вопроса, когда у меня будет время.