运行 一个 node.js 文件连续使用 HTTP 请求
Run a node.js file continuously using an HTTP request
我正在使用 node.js 和 express 创建一个应用程序,我有一个文件 TCPServer.js,我用它来不断轮询 TCP/IP 服务器。我希望能够向读取 IP 地址和端口号的数据库发送单个 HTTP 请求,然后使用该数据调用我的 TCPServer.js 文件,该文件轮询 TCP 服务器。
读取数据库有效,HTTP 请求适用于对 TCPServer 的单个调用,但每当我尝试并不断轮询 TCP 服务器时,我从服务器收到 1 个轮询响应,然后抛出 500 错误。
因此,如果 TCPServer.js 中只有 getInputData(ipAddress, connPort)
,那么 HTTP 请求就没有问题,returns 来自我的 TCP 服务器的响应一次和 200 响应。使用 setInterval(getInputData(ipAddress, connPort), 2000)
我得到一次数据和一个 500 错误响应。我可以让它每 2 秒轮询一次吗?
TCPServer.js
function getInputData(ipAddress, port) {
"Function for polling TCP Server runs in here"
}
const iModStart = function startInputModule(ipAddress, connPort) {
setInterval(getInputData(ipAddress, connPort), 2000)
}
module.exports = iModStart
运行 http 请求
的路由处理程序
const iModuleConnect = require('../utils/TCPServer')
//run the polling to input module
router.get('/connections_connect/:id', async (req, res) => {
const _id = req.params.id
try {
const connection = await Connection.findById(_id)
if (!connection) {
return res.status(404).send()
}
if(connection) {
console.log(connection.ipAddress)
console.log(connection.port)
iModuleConnect(connection.ipAddress, connection.port)
}
res.send(connection)
} catch(e) {
res.status(500).send()
}
})
module.exports = router
问题是 setInterval
需要一个回调函数作为它的第一个参数,但是您将已执行的 getInputData
函数的结果传递给它。
显然这一次有效,因为函数在第一个间隔之前执行,但是一旦在 2000 毫秒后达到间隔,就没有回调可以调用,节点将抛出 TypeError [ERR_INVALID_CALLBACK]: Callback must be a function
错误。
要解决此问题,您需要将函数参数绑定到 getInputData
并将其作为回调传递给 setInterval
:
const iModStart = function startInputModule(ipAddress, connPort) {
setInterval(getInputData.bind(getInputData, ipAddress, connPort), 2000);
}
我正在使用 node.js 和 express 创建一个应用程序,我有一个文件 TCPServer.js,我用它来不断轮询 TCP/IP 服务器。我希望能够向读取 IP 地址和端口号的数据库发送单个 HTTP 请求,然后使用该数据调用我的 TCPServer.js 文件,该文件轮询 TCP 服务器。
读取数据库有效,HTTP 请求适用于对 TCPServer 的单个调用,但每当我尝试并不断轮询 TCP 服务器时,我从服务器收到 1 个轮询响应,然后抛出 500 错误。
因此,如果 TCPServer.js 中只有 getInputData(ipAddress, connPort)
,那么 HTTP 请求就没有问题,returns 来自我的 TCP 服务器的响应一次和 200 响应。使用 setInterval(getInputData(ipAddress, connPort), 2000)
我得到一次数据和一个 500 错误响应。我可以让它每 2 秒轮询一次吗?
TCPServer.js
function getInputData(ipAddress, port) {
"Function for polling TCP Server runs in here"
}
const iModStart = function startInputModule(ipAddress, connPort) {
setInterval(getInputData(ipAddress, connPort), 2000)
}
module.exports = iModStart
运行 http 请求
的路由处理程序
const iModuleConnect = require('../utils/TCPServer')
//run the polling to input module
router.get('/connections_connect/:id', async (req, res) => {
const _id = req.params.id
try {
const connection = await Connection.findById(_id)
if (!connection) {
return res.status(404).send()
}
if(connection) {
console.log(connection.ipAddress)
console.log(connection.port)
iModuleConnect(connection.ipAddress, connection.port)
}
res.send(connection)
} catch(e) {
res.status(500).send()
}
})
module.exports = router
问题是 setInterval
需要一个回调函数作为它的第一个参数,但是您将已执行的 getInputData
函数的结果传递给它。
显然这一次有效,因为函数在第一个间隔之前执行,但是一旦在 2000 毫秒后达到间隔,就没有回调可以调用,节点将抛出 TypeError [ERR_INVALID_CALLBACK]: Callback must be a function
错误。
要解决此问题,您需要将函数参数绑定到 getInputData
并将其作为回调传递给 setInterval
:
const iModStart = function startInputModule(ipAddress, connPort) {
setInterval(getInputData.bind(getInputData, ipAddress, connPort), 2000);
}