Перезапуск сервиса в нод-окнах

Используя пакет node-windows, я устанавливаю сервер узла локально как сервис. Имея тогда интерфейс для изменения файла.env, когда я фактически изменяю конфигурации.env и сохраняю изменения, проблема заключается в том, что служба не перезапускается, как это должно быть, для подтверждения этих изменений. Кто-нибудь может подсказать мне, есть ли другой способ обработки перезапусков службы из этого пакета, или какие-либо другие способы обхода? Я на самом деле пытаюсь обработать перезапуск так:

const path = require("path");
let Service = require("node-windows").Service;
let EventLogger = require("node-windows").EventLogger;
const Messages= require("./models/messagesModel").getInstance();    
let filePathServer = path.resolve(__dirname, "app.backend.js");

class ServiceInstall {

    constructor(envConfig) {

    this.log = new EventLogger(envConfig.SERVICE_NAME);
    this.svc = new Service({
        name: envConfig.SERVICE_NAME,
        description: envConfig.SERVICE_DESCRIPTION,
        script: filePathServer,
        wait: envConfig.SERVICE_WAIT,
        grow: envConfig.SERVICE_GROW
    });
    }

    installWindowsService() {
        // event handlers to install the service
    }

    restartWindowsService(){
            this.svc.on("stop", () => {
                this.log.info("Service " + this.svc.name + " stopped!");
                Messages.info("Service " + this.svc.name + " stopped!");
            });
            this.svc.on("start", () => {
                this.log.info("Service " + this.svc.name + " started!");
                Messages.info("Service " + this.svc.name + " started!");
            });
            this.svc.restart();
        }

    }

module.exports = ServiceInstall;

1 ответ

Решение

В процессе установки node-windows по сути выполняет два шага:

  1. Создает .exe подать копию winsw.exe и сделать соответствующую запись в реестре Windows, чтобы Windows могла распознать это .exe в качестве службы Windows.

  2. Используйте значения, переданные в конструктор Service для генерации .xml файл с таким же именем.

Это означает, что когда-то .xml любые изменения, которые применяются к входным данным функции конструктора, не будут перенесены в .xml файл, если вы не выполните полную переустановку службы [используя svc.uninstall() с последующим svc.install()]

Если вы хотите динамически изменять входные данные, но без необходимости переустановки, вы должны поместить эти значения в config.json а потом просто require тот config.json из сценария, который вы пытаетесь разместить в качестве службы Windows.

Теперь, если вы внесете изменения в config.json вам просто нужно перезапустить сервис, чтобы отразить изменение.

Кроме того, если вы не хотите делать перезагрузку вручную каждый раз config.json изменения, использовать nodemon в execPath вместо node в объекте конфигурации передается Service конструктор.

Другие вопросы по тегам