首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从作为windows服务运行的Nodejs调用函数

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

Stack Overflow用户
提问于 2020-04-09 12:52:48
回答 2查看 603关注 0票数 4

我已经使用node-windows包从nodeJs应用程序创建了windows服务。下面是我的代码。

Main.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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()方法呢?我找不到任何解决方案,任何帮助都是最好的。

EN

回答 2

Stack Overflow用户

发布于 2020-04-23 05:26:57

您可以考虑简单地在需要的地方导入run函数并在其中运行它,这样就不需要windows服务或main.js了-这假设“任何外部应用程序”都是Node应用程序。

在您的其他应用程序中,您可以执行以下操作:

代码语言:javascript
复制
const app = require('<path to App.js>');
app.run(someNodes)

为了获得更广泛的使用,或者如果您确实需要将其作为服务运行,您可以使用调用run函数的端点在App.js中启动express (或另一个you服务器)。然后,从其他任何地方,您都需要对该端点进行http调用。

App.js

代码语言:javascript
复制
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数组。

票数 0
EN

Stack Overflow用户

发布于 2020-04-25 02:59:48

您可以像其他答案提到的那样在端口上公开它,但您需要确保不会根据运行环境的不同而更广泛地公开它。关于确保端口被锁定,here有一个很好的答案。

作为在端口上公开它的替代方法,您可以通过在任何其他应用程序中运行该命令来简单地调用该函数:

代码语言:javascript
复制
node -e 'require("/somePathToYourJS/app").run()'

一个令人担忧的问题是,app.js现在将以调用应用程序拥有的任何权限运行。尽管这个问题可以通过运行runas来解决。更多细节here。但下面是一个例子:

代码语言:javascript
复制
runas /user:domainname\username "node -e 'require(^"/somePathToYourJS/app^").run()'"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61114221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档