首页 > 解决方案 > 使用 Inno Setup 和 node-windows 脚本将节点应用程序安装为服务的问题

问题描述

当从 Inno Setup 运行以下脚本时,服务会安装但不会立即启动或在系统重新启动后启动:

#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";

验证安装程序节点windows.js:

var Service = require('node-windows').Service;
// Create a new service object
var svc = new Service({
     name:'receipt-validation-app1_7',
     description: 'Testing Team Receipt Validation.',
     script: 'C:\\xxxxx-receipt-validation-app1_v2\\app.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.

svc.on('install',function(){
     svc.start();
});

svc.install();

当 Inno Setup 安装程序运行时,它肯定会安装服务,并且在启动类型中设置为“自动”。但是,当我重新启动机器时,它不会自动启动。

但是,当我跑步时

节点验证安装程序节点windows.js

服务安装(在我更改名称后不会发生冲突)并立即自动启动而无需重新启动。

我也尝试过以管理员身份运行。validation-installer-node-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;
[Code]
procedure RunNodeInstall();
var
 ErrorCode: Integer;
begin
  if not Shellexec('', 'node', ExpandConstant('{app}\validation-installer-node-windows.js'),'',SW_HIDE,ewWaitUntilTerminated,ErrorCode) then
  begin
    MsgBox('Issue occured with installing application as a service!', mbInformation, MB_OK);
  end;
end;

同样,该脚本运行良好并安装了该服务。但是,与之前一样,它不会自动将状态设置为“正在运行”,并且当点击 nodejs 端点时,它会返回“无法连接”错误,然后服务状态会返回空白。


有一系列日志消息,它以:

C:\woolworths-receipt-validation-app1_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 --file C:\woolworths-receipt -validation-app1_v2\app.js --scriptoptions= --log "receipt-validation-app1_7 wrapper" --grow 0.25 --wait 1 --maxrestarts 3 --abortonerror n --stopparentfirst undefined] 以 0 结束

标签: installationinno-setupnode-windows

解决方案


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

感谢Martin Prikryl和Corey Butler为我指明了正确的方向。

的原型ShellExec如下:

函数 ShellExec(const Verb, Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ErrorCode: Integer): Boolean;

在这里找到

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

procedure InstallNodeApp();
var
  ErrorCode: Integer;
var
  C, P, D: String;
begin
  C := 'node';
  P := 'validation-installer-node-windows.js';
  D := ExpandConstant('{app}');
  if not ShellExec('', C, P, D, SW_HIDE, ewWaitUntilTerminated, ErrorCode) then 
  begin
    ErrorCode:= -1;
    MsgBox('Issue occured with installing application as a service!',
      mbInformation, MB_OK);
  end;
end;

可以确认它运行,安装服务,然后正常工作(在 localhost:8090 连接到应用程序并返回一个 Web 应用程序),并保持运行。


推荐阅读