如何从Nodejs中调用作为windows服务运行的函数。

问题描述 投票:1回答:1

我在nodeJs应用程序中使用node-windows包创建了windows服务。以下是我的代码。

Main.js

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'SNMPCollector',
  description: 'SNMP collector',
  script: './app.js',
  nodeOptions: [
    '--harmony',
    '--max_old_space_size=4096'
  ]
  //, workingDirectory: '...'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

svc.install();

/* svc.uninstall(); */

App.js

const { workerData, parentPort, isMainThread, Worker } = require('worker_threads')


var NodesList = ["xxxxxxx", "xxxxxxx"]

module.exports.run = function (Nodes) {
  if (isMainThread) {
    while (Nodes.length > 0) {

    // my logic

      })
    }
  }
}

现在当我运行main.js时,它创建了一个windows服务,我可以在services.msc中看到该服务的运行。

但是,我怎样才能从任何外部应用程序中调用这个运行在服务内部的run()方法呢?我找不到任何解决方案,任何帮助将是巨大的。

javascript node.js windows-services node-windows
1个回答
0
投票

你可以考虑简单地导入你的 run 函数,并在那里运行它,那么就不需要windows服务或 main.js - 这假定 "任何外部应用程序 "是一个 Node 应用程序。

在你的其他应用程序中,你可以做以下工作。

const app = require('<path to App.js>');
app.run(someNodes)

为了更广泛的使用,或者如果你需要把它作为一个服务来运行,你可以在你的App.js中启动一个express(或者其他的webserver),用一个端点来调用你的。run 函数。然后从其他地方你需要对该端点进行http调用。

App.js

const express = require('express')
const bodyParser = require('body-parser')
const { workerData, parentPort, isMainThread, Worker } = require('worker_threads')
const app = express()
const port = 3000

var NodesList = ["xxxxxxx", "xxxxxxx"]

const run = function (Nodes) {
  if (isMainThread) {
    while (Nodes.length > 0) {

    // my logic

      })
    }
  }
}

app.use(bodyParser.json())

app.post('/', (req, res) => res.send(run(req.body)))

app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))

(基于express的例子- https:/expressjs.comenstarterhello-world.html。)

你需要同时安装express和body-parser。$ npm install --save express body-parser 从App.js的目录下安装。

从你的其他应用程序中,你将需要调用端点的 http://localhost:3000 的POST请求和 Nodes 作为一个 JSON 数组。


0
投票

您可以像其他答案中提到的那样在某个 port 上公开它, 尽管您需要确保不会根据您所处的环境更广泛地公开它。有一个很好的答案 此处 以确保端口被锁定。

除了在端口上公开它之外, 您还可以在其他应用程序中运行该命令来简单地调用该函数。

node -e 'require("/somePathToYourJS/app").run()'

一个令人担忧的问题是, app.js 现在将以调用应用程序的任何权限运行。尽管可以通过在其他应用程序中运行 runas 之前。更多详情 此处. 但一个例子是:

runas /user:domainname\username "node -e 'require(^"/somePathToYourJS/app^").run()'"
© www.soinside.com 2019 - 2024. All rights reserved.