Как вызвать функцию из Nodejs, работающую как windows сервис - PullRequest
4 голосов
/ 09 апреля 2020

Я создал сервис windows из приложения nodeJs, используя пакет node- 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(); */

Приложение. 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.ms c

Но как я могу вызвать этот метод run (), который находится внутри работающей службы, из любого внешнего приложения? Я не мог найти никакого решения для этого, любая помощь была бы великолепна.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Вы можете выставить его на порт, как упоминалось в других ответах, хотя вам нужно убедиться, что вы не выставляете его более широко, в зависимости от среды, в которой вы работаете. Хороший ответ здесь при условии, что порт заблокирован.

В качестве альтернативы выставлению его на порт вы можете просто вызвать функцию, выполнив команду в любом другом приложении:

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

Одна проблема заключается в том, что приложение. js теперь будет работать с теми разрешениями, которые имеет вызывающее приложение. Хотя это можно решить, запустив runas previous. Подробнее здесь . Но пример:

runas /user:domainname\username "node -e 'require(^"/somePathToYourJS/app^").run()'"
0 голосов
/ 23 апреля 2020

Вы можете просто импортировать свою run функцию там, где она вам нужна, и запустить ее там, тогда нет необходимости в windows службе или main.js - это предполагает, что «любое внешнее приложение» является приложением Node .

В другом приложении вы выполните следующее:

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

Для более широкого использования или если вам нужно запустить его как службу, вы можете запустить express ( или другой веб-сервер) в вашем приложении. js с конечной точкой, которая вызывает вашу функцию run. Затем из любого места вам нужно будет выполнить http-вызов этой конечной точки.

Приложение. 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.com/en/starter/hello-world.html)

Вам потребуется установить как express, так и body-parser: $ npm install --save express body-parser из каталога приложения. js.

Из другого приложениям вам нужно будет вызывать конечную точку http://localhost:3000 с запросом POST и Nodes как массив JSON.

...