از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
خواندن فایلها با Node.js یکی از رایجترین کارهایی که میخواهید تقریباً با هر زبان برنامهنویسی انجام دهید، باز کردن و خواندن یک فایل است. با اکثر زبانها، این کار بسیار ساده است، اما برای جانبازان جاوا اسکریپت ممکن است کمی عجیب به نظر برسد. برای چندین سال جاوا اسکریپت فقط در مرورگر موجود بود،…
سرفصلهای مطلب
یکی از رایج ترین کارهایی که می خواهید تقریباً با هر زبان برنامه نویسی انجام دهید، باز کردن و خواندن یک فایل است. با اکثر زبانها، این کار بسیار ساده است، اما برای جانبازان جاوا اسکریپت ممکن است کمی عجیب به نظر برسد. برای چندین سال جاوا اسکریپت فقط در مرورگر موجود بود، بنابراین توسعه دهندگان فرانت اند ممکن است فقط با آن آشنا باشند FileReader API یا مشابه
Node.js، همانطور که احتمالا می دانید، بسیار متفاوت از جاوا اسکریپت معمولی شما در مرورگر است. مجموعه ای از کتابخانه های خاص خود را دارد که برای انجام وظایف سیستم عامل و سیستم فایل، مانند باز کردن و خواندن فایل ها، طراحی شده اند. در این مقاله روش استفاده از Node.js برای خواندن فایل ها را به شما نشان می دهم. به طور خاص، ما با استفاده از fs ماژول برای انجام همین کار.
دو روش وجود دارد که می توانید با استفاده از آن یک فایل را باز کرده و بخوانید fs
مدول:
- بارگیری همه محتویات به یکباره (بافر)
- بارگیری تدریجی محتوا (جریانسازی)
هر یک از این روش ها در دو بخش بعدی توضیح داده خواهد شد.
بافر کردن محتوا با fs.readFile
این رایج ترین راه برای خواندن یک فایل با Node.js است، به خصوص برای مبتدیان، به دلیل سادگی و راحتی. اگرچه، همانطور که در بخش بعدی متوجه خواهید شد، لزوما بهترین یا کارآمدترین نیست.
در اینجا یک مثال سریع از استفاده است fs.readFile:
var fs = require('fs');
fs.readFile('my-file.txt', 'utf8', function(err, data) {
if (err) throw err;
console.log(data);
});
را data
آرگومان بازگشت به تماس حاوی محتویات کامل فایل است که به صورت رشته ای نمایش داده شده است utf8
قالب اگر شما را حذف کنید utf8
آرگومان کامل، سپس متد فقط محتویات خام را در a برمی گرداند بافر هدف – شی. حذف کردن utf8
آرگومان در کد بالا (و با فرض my-file.txt حاوی رشته “Hey There!”)، این خروجی را دریافت می کنیم:
$ node read-file.js
<Buffer 48 65 79 20 74 68 65 72 65 21>
شاید متوجه شده باشید fs.readFile
محتویات را در یک callback برمی گرداند، به این معنی که این روش به صورت ناهمزمان اجرا می شود. این باید هر زمان که ممکن است برای جلوگیری از مسدود کردن رشته اصلی اجرا استفاده شود، اما گاهی اوقات باید کارها را به صورت همزمان انجام دهید، در این صورت Node به شما یک readFileSync روش.
این روش دقیقاً به همین صورت عمل می کند، با این تفاوت که محتویات فایل مستقیماً از فراخوانی تابع برگردانده می شود و رشته اجرا در هنگام بارگذاری فایل مسدود می شود. من معمولاً از این در بخشهای راهاندازی برنامههایم استفاده میکنم (مانند زمانی که در حال بارگذاری فایلهای پیکربندی هستیم) یا در command-line برنامههایی که در آنها مسدود کردن رشته اصلی کار چندان مهمی نیست.
در اینجا روش بارگذاری یک فایل به صورت همزمان با Node آمده است:
var fs = require('fs');
try {
var data = fs.readFileSync('my-file.txt', 'utf8');
console.log(data);
} catch(e) {
console.log('Error:', e.stack);
}
توجه داشته باشید که با مسدود کردن (همگام) تماس باید استفاده کنیم try...catch
برای رسیدگی به هر گونه خطا، بر خلاف نسخه غیر مسدود کننده (ناهمزمان) که در آن خطاها فقط به عنوان آرگومان به ما منتقل می شدند.
به غیر از روشی که این روشها دادهها را برمیگردانند و خطاها را مدیریت میکنند، بسیار یکسان عمل میکنند.
پخش مطالب با fs.createReadStream
راه دوم برای باز کردن و خواندن یک فایل این است که آن را به صورت a باز کنید جریان با استفاده از fs.createReadStream روش. همه جریانهای Node نمونههایی از این هستند Event Emitter شی، به شما امکان می دهد در رویدادهای مهم مشترک شوید.
یک شی جریان قابل خواندن می تواند به دلایل زیادی مفید باشد که چند مورد از آنها عبارتند از:
- ردپای حافظه کوچکتر. از آنجایی که دادههای فایل مورد نظر به صورت تکهای بارگذاری میشوند، برای ذخیره دادهها در یک بافر به حافظه زیادی نیاز نیست.
- زمان پاسخگویی سریعتر. برای برنامه های حساس به زمان، زمان بین درخواست و پاسخ بسیار مهم است. استریمها زمان پاسخدهی را کاهش میدهند (مخصوصاً برای فایلهای بزرگ)، زیرا نیازی به صبر کردن برای بارگیری کل فایل قبل از بازگشت داده ندارند.
- داده های لوله کشی. انتزاع جریان به شما امکان می دهد از یک رابط مشترک بین تولید کنندگان و مصرف کنندگان داده استفاده کنید تا آن داده ها را از طریق لوله ها منتقل کنید. این بسیار شبیه به لوله یونیکس مفهوم
اگرچه استفاده از استریمها واقعاً سخت نیست، اما میتوانند کمی ترسناک باشند و به اندازه جریانها بصری نیستند. fs.readFile
روش. در اینجا “سلام جهان” جریان فایل است:
var fs = require('fs');
var data = '';
var readStream = fs.createReadStream('my-file.txt', 'utf8');
readStream.روی('data', function(chunk) {
data += chunk;
}).روی('end', function() {
console.log(data);
});
این کد دقیقاً همان کاری را انجام می دهد که کد در بخش اول انجام می دهد، با این تفاوت که باید تکه هایی از داده ها را قبل از چاپ در console. اگر فایل شما نسبتاً کوچک است، احتمالاً تنها یک تکه را دریافت خواهید کرد، اما برای فایلهای بزرگتر، مانند صدا و تصویر، باید چندین تکه را جمع آوری کنید. این موردی است که شما ارزش واقعی فایل های جریانی را متوجه خواهید شد.
توجه داشته باشید که مثالی که در بالا نشان دادم عمدتاً هدف استفاده از یک جریان را نادیده میگیرد، زیرا به هر حال ما دادهها را در یک بافر (متغیر) جمعآوری میکنیم، اما حداقل به شما ایده میدهد که چگونه کار میکنند. مثال بهتری که نقاط قوت جریان فایل را نشان می دهد را می توان در اینجا مشاهده کرد، در یک مسیر Express که درخواست فایل را مدیریت می کند:
var fs = require('fs');
var path = require('path');
var http = require('http');
var staticBasePath = './static';
var staticServe = function(req, res) {
var fileLoc = path.resolve(staticBasePath);
fileLoc = path.join(fileLoc, req.url);
var stream = fs.createReadStream(fileLoc);
stream.روی('error', function(error) {
res.writeHead(404, 'Not Found');
res.end();
});
stream.pipe(res);
};
var httpServer = http.createServer(staticServe);
httpServer.listen(8080);
تنها کاری که در اینجا انجام می دهیم این است که فایل را با آن باز کنیم fs.createReadStream
و آن را به شی پاسخ لوله کنید، res
. ما حتی می توانیم مشترک شویم error
رویدادها و آنها را همانطور که اتفاق میافتند مدیریت کنید. هنگامی که روش استفاده صحیح از آن را یاد گرفتید، روش بسیار بهتری برای مدیریت فایل ها است. برای مثال کاملتر و توضیح کد بالا، این مقاله را بررسی کنید روی ایجاد سرورهای فایل استاتیک با Node.
نتیجه
از این مقاله باید اصول خواندن فایل ها و همچنین برخی از روش های پیشرفته بارگذاری با استفاده از اشیاء Stream را یاد گرفته باشید. دانستن زمان استفاده از آنها کلید اصلی است، و باید برای برنامه های با محدودیت حافظه یا زمان محدود مورد توجه قرار گیرد.
روش ترجیحی شما برای مدیریت فایل ها چیست؟ در گذشته چگونه از Streams استفاده کرده اید؟ در نظرات به ما اطلاع دهید!
(برچسبها برای ترجمه)# روش
منتشر شده در 1403-01-28 21:58:03