Installation 使用Inno安装程序和节点windows脚本将节点应用程序作为服务安装时出现问题

Installation 使用Inno安装程序和节点windows脚本将节点应用程序作为服务安装时出现问题,installation,inno-setup,node-windows,Installation,Inno Setup,Node Windows,从Inno安装程序运行以下脚本时,该服务将安装,但不会立即启动,也不会在系统重新启动后启动: #define .... #define NODE "node-v12.16.2-x64.msi" ... [Files] ... [Run] Filename: "{sys}\msiexec.exe"; Parameters: "/passive /i ""{app}\{#NODE}"""; Fi

从Inno安装程序运行以下脚本时,该服务将安装,但不会立即启动,也不会在系统重新启动后启动:

#define ....
#define NODE "node-v12.16.2-x64.msi"

...

[Files]
...

[Run]
Filename: "{sys}\msiexec.exe"; Parameters: "/passive /i ""{app}\{#NODE}""";
Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall add rule name=""Node In"" program=""{pf64}\nodejs\node.exe"" dir=in action=allow enable=yes"; Flags: runhidden;
Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall add rule name=""Node Out"" program=""{pf64}\nodejs\node.exe"" dir=out action=allow enable=yes"; Flags: runhidden;
Filename: "{pf64}\nodejs\node.exe"; Parameters: "{app}\validation-installer-node-windows.js";
validation-installer-node-windows.js:

var-Service=require('node-windows')。服务;
//创建新的服务对象
var svc=新服务({
名称:'receipt-validation-app1_7',
描述:“测试团队收据验证”,
脚本:“C:\\xxxxx-receipt-validation-app1\u v2\\app.js”
});
//侦听“install”事件,该事件指示
//进程作为服务提供。
svc.on('install',function(){
svc.start();
});
svc.install();
当Inno安装程序运行时,它肯定会安装服务,并且在启动类型中将其设置为“自动”。但是,当我重新启动机器时,它不会自动启动

然而,当我跑的时候

node validation-installer-node-windows.js

服务安装(在我更改名称以避免冲突后)并立即自动启动,无需重新启动

我也尝试过以管理员的身份运行。从终端运行
验证安装程序节点windows.js
时,不需要特殊权限


我尝试使用Pascal脚本和
AfterInstall
关键字触发.js脚本,如下所示:

Source: "C:\...\validation-installer-node-windows.js"; DestDir: "{app}"; \
    Flags: ignoreversion; AfterInstall: RunNodeInstall()

[Run]
; Add Firewall Rules
Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall add rule name=""Node In"" program=""{pf64}\nodejs\node.exe"" dir=in action=allow enable=yes"; Flags: runhidden;
Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall add rule name=""Node Out"" program=""{pf64}\nodejs\node.exe"" dir=out action=allow enable=yes"; Flags: runhidden;
[代码]
过程RunNodeInstall();
变量
错误代码:整数;
开始
如果不是Shellexec(“”,'node',ExpandConstant('{app}\validation installer node windows.js'),“”,SW_HIDE,ewwaituntiltered,ErrorCode),则
开始
MsgBox('将应用程序作为服务安装时出现问题!',mbInformation,MB_OK);
结束;
结束;
同样,脚本运行正常并安装服务。但是,与之前一样,它不会自动将状态设置为“Running”,当点击nodejs端点时,它会返回一个“无法连接”错误,然后会看到服务状态返回为空白


有一系列日志MSG,它从以下内容开始:

C:\woolworths-receipt-validation-app1\u v2\app.js已停止运行

然后:

意外退出后重新启动1250毫秒;尝试次数=1

这将重复3次尝试,最后一次日志显示:

子进程[5616-C:\Program Files\nodejs\node.exe--harmony C:\woolworths-receipt-validation-app1_v2\node_modules\node windows\lib\wrapper.js--C:\woolworths-receipt-validation-app1_v2\app.js--文件C:\woolworths-receipt-validation-app1_v2\app.js--脚本选项=--日志“receipt-validation-app1_7 wrapper”---0.25--等待1以0结束


我已经修好了。该错误与Inno安装程序创建临时目录并在该目录内执行的方式有关。基本上,我需要设置
WorkingDir
参数,正如您在上面看到的,我没有正确设置

这一切都归功于和为我指明了正确的方向

ShellExec的原型如下所示:

Source: "C:\...\validation-installer-node-windows.js"; DestDir: "{app}"; \
    Flags: ignoreversion; AfterInstall: RunNodeInstall()

[Run]
; Add Firewall Rules
Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall add rule name=""Node In"" program=""{pf64}\nodejs\node.exe"" dir=in action=allow enable=yes"; Flags: runhidden;
Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall add rule name=""Node Out"" program=""{pf64}\nodejs\node.exe"" dir=out action=allow enable=yes"; Flags: runhidden;
函数ShellExec(常量动词、文件名、参数,WorkingDir:String;const ShowCmd:Integer;const Wait:TExecWait;var 错误代码:整数):布尔值

发现

我已将我的代码修改为以下内容:

过程InstallNodeApp();
变量
错误代码:整数;
变量
C、 P,D:弦;
开始
C:=‘节点’;
P:='验证安装程序节点windows.js';
D:=ExpandConstant('{app}');
如果不是ShellExec(“”、C、P、D、SW_HIDE、EWWAITUNFilterminated、ErrorCode),则
开始
错误代码:=-1;
MsgBox('将应用程序作为服务安装时出现问题!',
MB信息,MB_OK);
结束;
结束;
可以确认它运行,安装服务,然后正常工作(连接到localhost:8090上的应用程序并返回一个web应用程序),并保持运行