>웹 프론트엔드 >JS 튜토리얼 >nodejs의 스트림과 파이프에 대한 심층적인 이해

nodejs의 스트림과 파이프에 대한 심층적인 이해

巴扎黑
巴扎黑원래의
2017-08-15 10:16:141781검색

이 글은 주로 nodejs의 스트림과 파이프 메커니즘을 이해하는 원리와 구현을 소개합니다. 관심 있는 친구들이 참고할 수 있습니다.

서문

몇일 전 누군가가 저에게 파이프 문제에 대해 물었습니다. 오랫동안 nodejs를 사용해왔지만 매번 많이 사용하지 않기 때문에 스트림 사용을 기피하는 경우가 많다는 것을 알게 되었고 지금은 다시 배우고 있습니다. 관련 지식을 정리합니다.

nodeschool을 통해 스트림 배우기

nodeschool에는 스트림 사용법을 가르치는 스트림 어드벤처 튜토리얼이 있으며 매우 간단합니다.

간단한 스트림에서 파이프로

우선 입력을 출력에 배치할 수 있습니다. 파이프라인을 통해 입력 및 출력은 콘솔, 파일 스트림 또는 http 요청이 될 수 있습니다(예:


process.stdin.pipe(process.stdout)
process.stdin.pipe(fs.createWriteStream(path))
fs.createReadStream(path).pipe(process.stdin)

파이프 중간에서 처리

파이프라인 중간에서 처리하려는 경우). 예를 들어 입력 문자열을 대문자로 변경하여 출력에 쓰려면 through2와 같은 중간 처리로 사용할 수 있는 일부 프레임워크를 사용할 수 있습니다. 이는 매우 편리합니다


var through2 = require('through2');
var stream = through2(write,end)
process.stdin
  .pipe(stream)
  .pipe(process.stdout);

function write(line,_,next){
  this.push(line.toString().toUpperCase())
  next();
})
function end(done){
  done();
})

stream이 변환됩니다. 일반 콜백으로

입력이 스트림이고 출력이 일반 함수인 경우 입력 스트림을 일반 함수 버퍼로 변환해야 합니다. 이때 concat-stream 라이브러리를 사용해 볼 수 있습니다


var concat = require('concat-stream');

var reverseStream=concat(function(text){
  console.log(text.toString().split("").reverse().join(""));
})

process.stdin.pipe(reverseStream)

http 서버의 스트림

은 stdin 및 fs와 유사합니다. 특성상 http도 스트림 사용에 적합하므로 비슷한 기능을 가지고 있습니다.


var http = require('http');
var server = http.createServer(function(req,res){
  req.pipe(res);
})

두 입력 역할을 모두 수행하는 스트림입니다. 그리고 출력

요청 프레임워크는 다음 기능을 구현하고, 스트림을 요청 요청에 파이프한 다음, 스트림의 내용을 서버로 보낸 다음, 다른 코드에서 사용할 수 있도록 스트림으로 반환합니다. 구현은 다음과 같습니다.


var request = require('request');
var r = request.post('http://localhost:8099');
process.stdin.pipe(r).pipe(process.stdout)

Branch Pipeline

다음 예는 입력 파이프라인에 있는 Loud 클래스가 포함된 html 요소를 대문자 작업을 위해 다른 파이프라인에 넣은 다음 최종적으로 출력


에 병합하는 예입니다.
var trumpet = require('trumpet');
var through2 = require('through2');
var fs = require('fs');
var tr = trumpet();
var stream = tr.select('.loud').createStream();
var upper = through2(function(buf,_,next){
  this.push(buf.toString().toUpperCase());
  next();
})
stream.pipe(upper).pipe(stream);
process.stdin.pipe(tr).pipe(process.stdout);

입력 및 출력 스트림 병합의 예

병합된 입력 및 출력은 이전 요청처럼 사용할 수 있습니다. 다음 예에서는 스트림을 사용하여 하위 프로세스


var spawn = require('child_process').spawn;
var duplexer2 = require('duplexer2');

module.exports = function(cmd, args){
  var c = spawn(cmd,args)
  return duplexer2(c.stdin,c.stdout)
}

요약

을 구현합니다. 위의 예를 통해 스트림과 기타 더 복잡한 응용 방법을 병합하는 방법을 알 수 있습니다. 전체적으로 다음과 같은 특성을 따릅니다.

  • Stream은 읽기 가능과 쓰기 가능

  • Stream은 파이프 방식

  • httpServer 및 httpClient와 파일 시스템 및 프로세스를 통해 흐름 방향을 제어합니다. stdinouterr는 보통 stream으로 사용 가능

  • Stream on(event)에 의해 일반 변수로 변환 가능, write

  • Stream 자체를 분할, 병합, 필터링 가능

위 내용은 nodejs의 스트림과 파이프에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.