Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 转换流提前停止处理_Node.js - Fatal编程技术网

Node.js 转换流提前停止处理

Node.js 转换流提前停止处理,node.js,Node.js,我尝试两次扩展node.js转换流,一次是将stdin拆分为新行,另一次是交替使用小写和大写 SplitLines按预期工作,但AlternateUppercase未按预期工作 index.js const{Transform}=require('stream') 类分割线扩展了变换{ _转换(块、编码、回调){ const parsed=chunk.toString().trim() const results=parsed.split('\n') 结果。forEach((行)=>{ this

我尝试两次扩展node.js转换流,一次是将stdin拆分为新行,另一次是交替使用小写和大写

SplitLines
按预期工作,但
AlternateUppercase
未按预期工作

index.js
const{Transform}=require('stream')
类分割线扩展了变换{
_转换(块、编码、回调){
const parsed=chunk.toString().trim()
const results=parsed.split('\n')
结果。forEach((行)=>{
this.push(`${line}\n`)
})
}
}
类AlternateUppercase扩展了转换{
构造函数(选项){
超级(选项)
this.isEven=false
}
_转换(块、编码、回调){
const line=chunk.toString()
const changed=this.isEven?line.toUpperCase():line
this.push(`${changed}\n`)
this.isEven=!this.isEven
}
}
进程.stdin
.管道(新的拆分线())
.pipe(新的AlternateUppercase())
.管道(工艺标准)
我是如何测试的 我在终点站看到了什么 我期望看到的 如果我做错了什么导致

在中,您需要调用
回调
函数才能接收下一个块。这在
SplitLines
函数中并不明显,因为您将整个字符串作为单个块传递。但是,当您重复执行推送操作时,
SplitLines
,会发送多个块,因此需要调用
回调
函数

const { Transform } = require('stream')

class SplitLines extends Transform {
  _transform(chunk, encoding, callback) {
    const parsed = chunk.toString().trim()
    const results = parsed.split('\n')
    results.forEach((line) => {
      this.push(`${line}\n`)
    })
  }
}

class AlternateUppercase extends Transform {
  constructor(options) {
    super(options)
    this.isEven = false
  }

  _transform(chunk, encoding, callback) {
    const line = chunk.toString()
    const altered = this.isEven ? line.toUpperCase() : line
    this.push(`${altered}\n`)
    callback() //must call callback to receive next chunk
    this.isEven = !this.isEven
  }
}

process.stdin
  .pipe(new SplitLines())
  .pipe(new AlternateUppercase())
  .pipe(process.stdout)
产出将是:

one

TWO

three


出现多个新行是因为您在两个变压器上都
\n
。要解决此问题,只需添加一次
\n
,即仅在拆分行或AlternateUppercase处添加

one
TWO
three

const { Transform } = require('stream')

class SplitLines extends Transform {
  _transform(chunk, encoding, callback) {
    const parsed = chunk.toString().trim()
    const results = parsed.split('\n')
    results.forEach((line) => {
      this.push(`${line}\n`)
    })
  }
}

class AlternateUppercase extends Transform {
  constructor(options) {
    super(options)
    this.isEven = false
  }

  _transform(chunk, encoding, callback) {
    const line = chunk.toString()
    const altered = this.isEven ? line.toUpperCase() : line
    this.push(`${altered}\n`)
    callback() //must call callback to receive next chunk
    this.isEven = !this.isEven
  }
}

process.stdin
  .pipe(new SplitLines())
  .pipe(new AlternateUppercase())
  .pipe(process.stdout)
one

TWO

three