我在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()方法呢?我找不到任何解决方案,任何帮助将是巨大的。
你可以考虑简单地导入你的 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 数组。
您可以像其他答案中提到的那样在某个 port 上公开它, 尽管您需要确保不会根据您所处的环境更广泛地公开它。有一个很好的答案 此处 以确保端口被锁定。
除了在端口上公开它之外, 您还可以在其他应用程序中运行该命令来简单地调用该函数。
node -e 'require("/somePathToYourJS/app").run()'
一个令人担忧的问题是, app.js 现在将以调用应用程序的任何权限运行。尽管可以通过在其他应用程序中运行 runas
之前。更多详情 此处. 但一个例子是:
runas /user:domainname\username "node -e 'require(^"/somePathToYourJS/app^").run()'"