我已经使用node-windows包从nodeJs应用程序创建了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时,它会创建一个services.msc服务,并且我可以看到该服务正在windows中运行
但是,我如何从外部应用程序调用运行服务内部的run()方法呢?我找不到任何解决方案,任何帮助都是最好的。
发布于 2020-04-22 21:26:57
您可以考虑简单地在需要的地方导入run
函数并在其中运行它,这样就不需要windows服务或main.js
了-这假设“任何外部应用程序”都是Node应用程序。
在您的其他应用程序中,您可以执行以下操作:
const app = require('<path to App.js>');
app.run(someNodes)
为了获得更广泛的使用,或者如果您确实需要将其作为服务运行,您可以使用调用run
函数的端点在App.js中启动express (或另一个you服务器)。然后,从其他任何地方,您都需要对该端点进行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.com/en/starter/hello-world.html的示例)
您需要从App.js目录安装express和body-parser:$ npm install --save express body-parser
。
在其他应用程序中,您将需要使用POST请求调用端点http://localhost:3000
,并将Nodes
作为JSON数组。
发布于 2020-04-24 18:59:48
您可以像其他答案提到的那样在端口上公开它,但您需要确保不会根据运行环境的不同而更广泛地公开它。关于确保端口被锁定,here有一个很好的答案。
作为在端口上公开它的替代方法,您可以通过在任何其他应用程序中运行该命令来简单地调用该函数:
node -e 'require("/somePathToYourJS/app").run()'
一个令人担忧的问题是,app.js现在将以调用应用程序拥有的任何权限运行。尽管这个问题可以通过运行runas
来解决。更多细节here。但下面是一个例子:
runas /user:domainname\username "node -e 'require(^"/somePathToYourJS/app^").run()'"
https://stackoverflow.com/questions/61114221
复制相似问题