Node.js_node.js의 스트림 모듈에 있는 Readable 객체에 대한 간략한 분석

WBOY
풀어 주다: 2016-05-16 15:48:16
원래의
881명이 탐색했습니다.

저는 nodejs에 대해 이야기하는 것을 항상 꺼려했습니다. 처음 봤을 때부터 디자인이 정말 역겹다고 생각했기 때문입니다. 그런데 방법이 없네요, 아직 스트림 사양이 대중화되지 않았고, 실제로 nodejs 스트림에 의존해서 구현하는 것들이 많아서 코를 막고 총알을 물고 당길 수 밖에 없습니다. 이것은 냄새가 나고 단단합니다. nodejs 스트림 개체입니다.
Nodejs에는 stream이라는 모듈이 함께 제공됩니다. 이를 도입하면 일련의 스트림 객체 생성자를 얻을 수 있습니다. 이제 가장 간단한 스트림에 대해서만 이야기하겠습니다.읽을 수 있습니다.
실제로 nodejs를 사용하는 거의 모든 사람들이 Readable 인스턴스를 접했지만 그다지 관심을 기울이지 않습니다. 매우 일반적인 예입니다. http 모듈에서는 각 요청을 처리할 때 req 및 res 객체가 실제로 Readable 객체입니다. 이 요청에서 스트림 형식으로 HTTP 요청의 엔터티 부분을 읽을 수 있습니다.
그렇다면 질문은 왜 여기서 http 모듈이 스트리밍 방식으로 설계되었는가 하는 것입니다. 또는 다른 차원에서 이 질문을 하는 것은 "nodejs는 POST 요청의 내용을 어떻게 얻습니까?"입니다. 검색 엔진을 사용할 줄 아는 학생들은 확실히 그러한 답을 쉽게 찾을 수 있습니다. 데이터 이벤트를 들어 데이터를 수집하고, 수집된 데이터를 최종 이벤트에서 병합하는 것입니다. 예, 이것이 이 문제에 대한 해결책입니다. 그런데 왜 이렇게 설계되었을까요? PHP처럼 POST 콘텐츠를 직접 얻을 수 있다면 얼마나 좋을까요? 사실 이 디자인은 우리가 수신하는 데이터가 불법이라면 즉시 이를 감지하고 대응하고 연결을 끊을 수 있다는 점에서 유익합니다. 이를 통해 불필요한 전송 비용을 피할 수 있습니다. 예를 들어, 사진을 업로드할 때 사용자가 실수로 큰 실행 파일을 선택할 수 있습니다. 파일이 완전히 업로드될 때까지 기다릴 필요가 없으며 파일이 사진인지 확인하기 위해 파일 헤더에 몇 바이트만 있으면 됩니다. . 여기서 스트림 설계를 사용하면 먼저 사용할 처음 몇 바이트를 읽을 수 있습니다.
위에서 언급한 데이터 이벤트와 종료 이벤트는 모두 Readable 이벤트입니다. 이 두 이벤트는 각각 데이터 수신과 데이터 수신 완료를 나타냅니다. 그래서 사실 우리는 이미 Readable의 사용법을 알고 있지만, 많은 사람들은 그것이 Readable 객체라는 사실을 모릅니다.
그러나 위의 두 이벤트는 Readable 소비자를 위한 이벤트일 뿐입니다. Readable이 이러한 이벤트를 트리거할 수 있도록 내부적으로 Readable 객체에 데이터 조각을 어떻게 푸시합니까? 그 다음은 push 방식이다. 다음은 증가하는 숫자를 스트리밍하는 Readable 객체를 생성하는 예입니다(여기서는 babel-node가 사용됨)

import stream from 'stream';

var r = new stream.Readable;

r.on('data', data => {
 console.log(data + '');
});

r.on('end', data => {
 console.log('end');
});

r._read = () => {
 // console.log('before read');
};

void function callee(i) {
 if(i < 10) {
  r.push(i + ''); // 只能传入字符串或 Buffre 对象
 } else {
  r.push(null); // 当输入一个 null 时表示流传输完成,触发 end 事件 
 }
 setTimeout(callee, 500, i + 1);
}(0);

로그인 후 복사

위의 코드를 자세히 살펴보면 매우 마법 같은 곳을 발견할 수 있습니다. 이 코드는 _read 메소드를 재정의합니다. 사실 저는 이것이 함정이라고 생각합니다. 이 비공개 명명 스타일을 구현하기 위해 왜 이 메서드를 재정의해야 합니까? 이 메서드를 재정의하지 않으면 push를 호출할 때 예외가 발생합니다.

 Error: not implemented
  at Readable._read (_stream_readable.js:464:22)
  at Readable.read (_stream_readable.js:341:10)
로그인 후 복사

위 내용은 Readable 객체의 기본 사용법입니다. 하지만 넘어야 할 함정이 더 있습니다. 이 기사는 모든 사람이 데이터를 출력할 수 있는 Readable 개체를 만드는 방법을 배울 수 있도록 하는 가장 간단한 소개입니다. 읽기와 같은 몇 가지 기본적인 방법은 어쨌든 비과학적인 설계 중 하나입니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!