具有解压缩内容的节点js spawn / exec的奇怪行为

时间:2017-08-31 13:07:11

标签: node.js windows node8.2

我正在尝试编写一个使用nodejs和mqtt安装和更新软件包的客户端。我测试了数据传输和存档的所有功能,但当我来到Windows环境并且试图运行一些脚本时,我遇到了一些奇怪的错误。

我会添加一些代码,这样任何人都可以看到我如何将下载的内容写入磁盘,但首先我会解释一下行为。

每次尝试采取的步骤:

  • 从mqtt(作品)下载内容
  • 从中创建缓冲区和流(工作)
  • 将流解压缩到磁盘(正常工作)
  • 在下载的内容中运行批处理作业(发生奇怪的事情)
  • 运行另一个批处理作业(甚至是陌生人)

奇怪的事情:首先尝试使用:error spawn cmd.exe ENOENT生成spawn / exec respoonses,但在第二次尝试时(由主题订阅触发)它会超过该阶段。但是第一个批处理作业通过第二个作业时的下一次尝试返回错误: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()
    })
  })
}

1 个答案:

答案 0 :(得分:0)

事实证明unzip-stream在文件写入dist之前调用了finish和close事件,这导致文件无法通过批处理脚本运行。我把图书馆转移了,但它确实有效。