我正在尝试编写一个客户端,它使用带有 mqtt 的 nodejs 安装和更新包。我测试了数据传输和归档的所有功能,但是当我进入 Windows 环境并实际上尝试运行一些脚本时,我遇到了一些奇怪的错误。
我将添加一些代码,以便任何人都可以清楚地看到我如何将下载的内容写入磁盘,但首先我将解释行为。
每次迭代采取的步骤:
- 从 mqtt 下载内容(作品)
- 创建缓冲区并从中流式传输(有效)
- 将流解压缩到磁盘(有效)
- 在下载的内容中运行批处理作业(发生奇怪的事情)
- 运行另一个批处理作业(甚至更陌生)
奇怪的事情:第一次尝试 spawn/exec 响应:error spawn cmd.exe ENOENT
,但在第二次尝试(由主题订阅触发)时,它超过了那个阶段。但是当第一个批处理作业通过第二个作业时的下一次迭代返回错误:EBUSY: resource busy or locked, open C:\...appt@0.0.1\nssm.exe'
nssm.exe 是从批处理作业调用的文件
下载和提取代码:
const debug = require('debug')('service-manager:functions:download')
const serviceBus = require('../helpers/mqtt-helper.js')
const stream = require('stream')
const unzip = require('unzip-stream')
module.exports = (service, to, from) => {
debug(`Downloading ${service}@${to}`)
return serviceBus.getFromBus(`service_manager/${service}/${to}`)
.then(data => {
debug(`Downloaded ${service}@${to}`)
return new Promise((resolve, reject) => {
debug(`Unzipping ${service}@${to}`)
const buffer = Buffer.from(data)
const bufferStream = new stream.PassThrough()
bufferStream.end(buffer)
bufferStream.pipe(unzip.Extract({
path: `${__dirname}/../../services/active/${service}@${to}`
})).on('finish', resolve)
}).then(() => {
debug(`Unzipped ${service}@${to}`)
})
})
}
用于运行批处理作业的代码:
const debug = require('debug')('service-manager:functions:runner')
const { exec } = require('child_process')
const { resolve } = require('path')
module.exports = (type, reverse) => (service, to, from) => {
return new Promise((resolve, reject) => {
debug(`Running ${type} for ${service}@${reverse ? from : to}`)
const batchFile = resolve(
`../../services/active/${service}@${reverse ? from : to}/${type}.sh`
)
exec(batchFile, (error, stdout, stderr) => {
if (error) {
return reject(error)
}
debug(`Gotten STDOUT on ${type} for ${service}@${reverse ? from : to}: ${stdout}`)
debug(`Gotten STDERR on ${type} for ${service}@${reverse ? from : to}: ${stderr}`)
return resolve()
})
})
}