nodejs child_process输出的命令行被截断怎么办?

广告位招租
扫码页面底部二维码联系

nodejs的child_process【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。可以直接用于执行命令,利用spawn轻松【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net通过stdout, stderr获取输出转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】的内容。但是,在获取内容时,有一个不好的【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。地方,stdout, stderr输出的【本文受版权保护】转载请注明出处:www.tangshuang.net内容是以流的形式,需要通过监听data来本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】读取流式输出,而这个过程中,它的输出可能【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】比较随机,断句并不一定是某条命令行语句执转载请注明出处:www.tangshuang.net原创内容,盗版必究。行后的完整输出,而可能是命令行中到一定时原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。间就输出,这个时候就会造成断句混乱:

本文作者:唐霜,转载请注明出处。【转载请注明来源】【作者:唐霜】未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net
const { spawn } = require('child_process')
const child = spawn('npm', ['install', '--verbose'], { cwd: process.cwd() })
child.stdout.on('data', fn)
child.stderr.on('data', fn)

function fn(data) {著作权归作者所有,禁止商业用途转载。
本文版权归作者所有,未经授权不得转载。【转载请注明来源】 console.log(data.to本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。String())
未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】 }【未经授权禁止转载】

未经授权,禁止复制转载。【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】

【未经授权禁止转载】【本文受版权保护】转载请注明出处:www.tangshuang.net原创内容,盗版必究。

这就比较麻烦,界面上显示的内容错位了。解【作者:唐霜】【本文受版权保护】决的办法是什么呢?其实你不要用conso【未经授权禁止转载】原创内容,盗版必究。le.log,而是要自己写一个输出逻辑,本文版权归作者所有,未经授权不得转载。【转载请注明来源】两个流并行,对于stdout输出的内容直原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net接连接到上一个输出的就可以了。另外写一个本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。流,当有新的内容被加入的时候,通过触发一著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】个函数,检查内容的最后一个\r\n,然后【转载请注明来源】本文版权归作者所有,未经授权不得转载。在这里截断,把前面的内容输出即可。

【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】

下面是我实现的一个函数:【转载请注明来源】

【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net
export function execute(cmd, callback, cwd = process.cwd()) {
  return new Promise((resolve, reject) => {
    let items = cmd.split(' ')
    let exe = items.shift()
    let processor = spawn(exe, items, { cwd })
    let collect = () => {
      let str = ''
      let print = () => {
        let lines = str.split(/[\n|\r\n]/)
        str = lines.pop()
        let contents = lines.join('\r\n')
        if (str === '') { // 如果本来内容就是完整断句的,这里进行修正,表示结尾是正常断句的
          contents += '\r\n'
        }
        callback(contents)
      }
      return (data) => {
        str += data.toString()
        print()
      }
    }
    if (typeof callback === 'function') {
      processor.stdout.on('data', collect())
      processor.stderr.on('data', collect())
    }
    processor.on('error', reject)
    processor.on('close', resolve)
  })
}

用法很简单未经授权,禁止复制转载。

未经授权,禁止复制转载。未经授权,禁止复制转载。【未经授权禁止转载】【未经授权禁止转载】原创内容,盗版必究。
await execute('npm install --verbose', (contents) => console.log(contents))

这样,用console.log打印的内容原创内容,盗版必究。转载请注明出处:www.tangshuang.net,就不会出现断句不正常的问题了。

著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。

2018-10-17 8696 ,

为价值买单,打赏一杯咖啡

本文价值86.96RMB