Node.js のストリームは非常に強力で、一部のシナリオでは、潜在的に大きなファイルの処理と抽象データの処理と配信をサポートします。非常に使いやすいため、実際の戦闘ではこれをベースにしてツールの関数/ライブラリを作成することがよくありますが、ストリームの特性を無視しているため、作成した関数/ライブラリが要件を満たさない場合があります。 . 望ましい効果、またはいくつかの隠された地雷を敷設します。この記事では、ストリームベースのツールを作成するときに役立つと思われる 2 つのヒントを紹介します。
1. EVENTEMITTER のメモリ リークに注意してください
複数回呼び出される可能性のある関数内で、特定の操作を実行するためにストリームにイベント リスナーを追加する必要がある場合。次に、リスナーの追加によって引き起こされるメモリ リークに注意する必要があります:
'use strict'; const fs = require('fs'); const co = require('co'); function getSomeDataFromStream (stream) { let data = stream.read(); if (data) return Promise.resolve(data); if (!stream.readable) return Promise.resolve(null); return new Promise((resolve, reject) => { stream.once('readable', () => resolve(stream.read())); stream.on('error', reject); stream.on('end', resolve); }) } let stream = fs.createReadStream('/Path/to/a/big/file'); co(function *() { let chunk; while ((chunk = yield getSomeDataFromStream(stream)) !== null) { console.log(chunk); } }).catch(console.error);
上記のコードでは、ストリームがエラーを報告するかデータがない場合、getSomeDataFromStream 関数はエラー イベントと終了イベントをリッスンすることで Promise を完了します。ただし、コードを実行すると、すぐにコンソールにアラーム メッセージが表示されます: (ノード) 警告: EventEmitter メモリ リークの可能性が検出されました。制限を増やすには、emitter.setMaxListeners() を使用してください。この関数が呼び出されるたびに、追加のエラー イベント リスナーと終了イベント リスナーが受信ストリームに追加されます。この潜在的なメモリ リークを回避するには、関数を実行するたびに、この呼び出しによって追加されたすべてのリスナーがクリアされて関数が汚染されないようにする必要があります。
function getSomeDataFromStream (stream) { let data = stream.read(); if (data) return Promise.resolve(data); if (!stream.readable) return Promise.resolve(null); return new Promise((resolve, reject) => { stream.once('readable', onData); stream.on('error', onError); stream.on('end', done); function onData () { done(); resolve(stream.read()); } function onError (err) { done(); reject(err); } function done () { stream.removeListener('readable', onData); stream.removeListener('error', onError); stream.removeListener('end', done); } }) }
2 番目に、データの処理後にツール関数のコールバックが呼び出されることを確認します
ツール関数は、ストリーム内のすべてのデータが処理された後、コールバック関数パラメーターを外部に提供することがよくあります。通常のアプローチは、ストリームの終了イベントでコールバック関数をハングすることです。ただし、処理される場合 関数は時間のかかる非同期操作であり、すべてのデータが処理される前にコールバック関数が呼び出される場合があります:
'use strict'; const fs = require('fs'); let stream = fs.createReadStream('/Path/to/a/big/file'); function processSomeData (stream, callback) { stream.on('data', (data) => { // 对数据进行一些异步耗时操作 setTimeout(() => console.log(data), 2000); }); stream.on('end', () => { // ... callback() }) } processSomeData(stream, () => console.log('end'));
ストリームの終了イベントはストリーム内のデータが読み取られたときにのみトリガーされるため、すべてのデータが処理されていないときに上記のコードのコールバックが呼び出される可能性があります。したがって、データが処理されたかどうかをさらに確認する必要があります:
function processSomeData (stream, callback) { let count = 0; let finished = 0; let isEnd = false; stream.on('data', (data) => { count++; // 对数据进行一些异步耗时操作 setTimeout(() => { console.log(data); finished++; check(); }, 2000); }); stream.on('end', () => { isEnd = true; // ... check(); }) function check () { if (count === finished && isEnd) callback() } }
このようにして、すべてのデータが処理された後にコールバックがトリガーされます。

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

本篇文章带大家详解package.json和package-lock.json文件,希望对大家有所帮助!

本篇文章给大家分享一个Nodejs web框架:Fastify,简单介绍一下Fastify支持的特性、Fastify支持的插件以及Fastify的使用方法,希望对大家有所帮助!

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node.js项目打包为可执行文件的方法,希望对大家有所帮助!

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

Dreamweaver Mac版
ビジュアル Web 開発ツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

ホットトピック



