使用Promisify时找不到属性“ SVC”



我正在尝试编写它将作为Windows服务运行的应用程序。为此,我使用了node-windows软件包。该应用程序将在启动时每秒打印一条简单的消息(至少目前( - 使用tasktimer来反抗计时器。我发现的问题是,当未安装服务时,它将尝试启动服务然后安装(它具有异步(。因此,我尝试使用promisify解决此问题(能够使用async - await,但现在给我错误:TypeError: Cannot read property 'svc' of undefined ...

这是创建服务对象并声明方法的类:

import * as pEvent from 'p-event'
var Service = require('node-windows').Service;
export class winServ {
    svc = new Service({
        name: 'Cli app',
        description: 'Just a cli app...',
        script: './src/index.js'
    });
    async alreadyInstalled() {
        //check if service was already installed - return 0 or 1
        this.svc.install();
        await pEvent(this.svc, 'alreadyinstalled')
        .then( () => {
            console.log('Already installed!');
            return 1;
        });
        return 0;
    }
    async installWinServ() {
        this.svc.install();
        await pEvent(this.svc, 'install')
        .then( () => {
            console.log('Service now installed!');
        });
    }
    async uninstallWinServ() {
        this.svc.uninstall();
        // await pEvent(this.svc, 'alreadyuninstalled')
        // .then( () => {
        //  console.log('Already uninstalled!');
        //  return;
        // });
        await pEvent(this.svc, 'uninstall')
        .then( () => {
            console.log('Uninstall complete.');
            console.log('The service exists: ', this.svc.exists);
        })
    }
    async runWinServ() {
        console.log('Service has started!');
        await this.svc.start();
    }
    async stopWinServ() {
        await this.svc.stop();
    }
}

这是我调用类并尝试执行逻辑的index.ts文件:1.运行安装方法(如果已经安装了安装方法,只需打印消息并返回;如果没有,请安装服务(2.运行应用程序(它将无限运行(

import { winServ } from './windowsService/winServ';
var main = async () => {
    try {
            let serv = new winServ();
            //let alreadyInstalled = await serv.alreadyInstalled();
            //if (alreadyInstalled == 0) {
                await serv.installWinServ();
            //}
            await serv.runWinServ();
            let timer = new TaskTimer();
            // define a timer that will run infinitely
            timer.add(() => {
               console.log("abcd");
               timer.interval = 1000;
            });
            // start the timer
            timer.start();
            }
    }
    catch (err) {
        console.log(err);
    }
}
main();

更新:好的,现在我跳过了(联合国(安装检查,这给我带来了错误:

TypeError: Cannot read property 'send' of null
    at process.killkid (C:Programsnode_modulesnode-windowslibwrapper.js:177:11)

这使得服务在开始后立即停止。有什么想法吗?:(

util.promisify(serv.installWinServ)不绑定到 serv,无法访问正确的 this上下文。

async函数的合理是一个错误。installWinServ等已经返回承诺。他们没有正确使用承诺,因为this.svc.on没有返回承诺,也不能被 await ED。活动听众需要承诺,例如使用p-event

await pEvent(this.svc, 'alreadyinstalled');

events.once(节点11或更高(:

await once(this.svc, 'alreadyinstalled');

相关内容

  • 没有找到相关文章

最新更新