我正在尝试编写它将作为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');