
مكتبة Node.js لدفق الملفات كاستجابات HTTP مع دعم المحتوى الجزئي والطلبات الشرطية ورؤوس التخزين المؤقت القابلة للتكوين. مصممة للاستخدام في أطر الويب مثل Fastify.
Send هي مكتبة لبث الملفات من نظام الملفات كاستجابة HTTP، وتدعم الاستجابات الجزئية (Ranges)، والتفاوض الشرطي لطلبات GET (If-Match، وIf-Unmodified-Since، وIf-None-Match، وIf-Modified-Since)، وتغطية اختبارات عالية، وأحداثًا دقيقة يمكن الاستفادة منها لاتخاذ الإجراءات المناسبة في تطبيقك أو إطار عملك.
هذه وحدة Node.js متاحة عبر
سجل npm. يتم التثبيت باستخدام
أمر npm install:
$ npm install @fastify/send
يجب استخدام @types/mime@3 إذا كنت ترغب في استخدام TypeScript؛
فقد أزالت @types/mime@4 أنواع mime.
$ npm install -D @types/mime@3
const send = require('@fastify/send')
وفّر statusCode وheaders وstream للمسار المحدد لإرساله إلى
res. يمثّل req طلب HTTP الخاص بـ Node.js، وpath هو مسار مُرمَّز بعنوان URL
للإرسال (مُرمَّز بعنوان URL، وليس مسار نظام الملفات الفعلي).
تفعيل أو تعطيل قبول الطلبات ذات النطاقات، القيمة الافتراضية هي true.
سيؤدي تعطيل هذا إلى عدم إرسال Accept-Ranges وتجاهل محتويات
ترويسة الطلب Range.
تفعيل أو تعطيل تعيين ترويسة الاستجابة Cache-Control، القيمة الافتراضية هي
true. سيؤدي تعطيل هذا إلى تجاهل خيارَي immutable وmaxAge.
افتراضيًا، تستخدم هذه المكتبة وحدة mime لتعيين Content-Type
في الاستجابة بناءً على امتداد الملف المطلوب.
لتعطيل هذه الوظيفة، عيّن contentType إلى false.
سيلزم تعيين ترويسة Content-Type يدويًا في حال التعطيل.
حدّد كيفية التعامل مع "الملفات النقطية" (dotfiles) عند مواجهتها. الملف النقطي هو ملف
أو دليل يبدأ بنقطة ("."). لاحظ أن هذا الفحص يتم على
المسار نفسه دون التحقق من وجود المسار على
القرص. إذا تم تحديد root، فسيتم فحص الملفات النقطية الواقعة فوق الجذر فقط
(أي يمكن أن يكون الجذر نفسه داخل ملف نقطي عند تعيينه
إلى "deny").
'allow' لا معاملة خاصة للملفات النقطية.'deny' إرسال 403 لأي طلب لملف نقطي.'ignore' التظاهر بأن الملف النقطي غير موجود وإرجاع 404.القيمة الافتراضية مشابهة لـ 'ignore'، باستثناء أن
هذه القيمة الافتراضية لن تتجاهل الملفات داخل دليل يبدأ
بنقطة، وذلك للتوافق مع الإصدارات السابقة.
إزاحة البايت التي ينتهي عندها التدفق، القيمة الافتراضية هي طول الملف
ناقص 1. النهاية شاملة في التدفق، بمعنى أن end: 3 سيتضمن
البايت الرابع في التدفق.
تفعيل أو تعطيل توليد etag، القيمة الافتراضية هي true.
إذا لم يكن الملف المحدد موجودًا، فجرّب إلحاق أحد الامتدادات المحددة،
بالترتيب المحدد. افتراضيًا، هذا معطّل (مضبوط على false). مثال
على قيمة ستخدم ملفات HTML بلا امتداد: ['html', 'htm'].
يتم تخطي هذا إذا كان الملف المطلوب يمتلك امتدادًا بالفعل.
تفعيل أو تعطيل توجيه immutable في ترويسة الاستجابة
Cache-Control، القيمة الافتراضية هي false. إذا تم تعيينه إلى true، فينبغي
تحديد خيار maxAge أيضًا لتمكين التخزين المؤقت. سيمنع توجيه immutable
العملاء المدعومين من إجراء طلبات شرطية خلال مدة
خيار maxAge للتحقق مما إذا كان الملف قد تغيّر.
افتراضيًا يدعم send ملفات "index.html"، لتعطيل هذا
عيّن false أو لتوفير فهرس جديد مرّر سلسلة أو مصفوفة
بالترتيب المفضّل.
تفعيل أو تعطيل ترويسة Last-Modified، القيمة الافتراضية هي true. يستخدم قيمة
آخر تعديل الخاصة بنظام الملفات.
وفّر max-age بالمللي ثانية للتخزين المؤقت عبر HTTP، القيمة الافتراضية هي 0. يمكن أن يكون هذا أيضًا سلسلة مقبولة من وحدة ms.
حدّد الحد الأقصى لحجم محتوى الاستجابة، القيمة الافتراضية هي حجم الملف بالكامل.
سيُستخدم هذا عندما تكون acceptRanges مساوية لـ true.
يُستدعى بالمسار المطلق للملف المحدد نهائيًا وإحصاءات نظام الملفات
بعد حلّ الملف، ولكن قبل معالجة الاستجابة وإنشاء تدفق الملف.
يمكن أن تكون دالة الاستدعاء متزامنة أو تُرجع وعدًا (promise). إذا أرجعت وعدًا،
فإن send ينتظر حتى يُحسم. إذا رمت دالة الاستدعاء استثناءً أو
رُفض الوعد الذي أرجعته، فسيتم إلغاء العملية ويرفض send().
خدمة الملفات نسبةً إلى path.
إزاحة البايت التي يبدأ عندها التدفق، القيمة الافتراضية هي 0. البداية شاملة،
بمعنى أن start: 2 سيتضمن البايت الثالث في التدفق.
عند توفيره، يضبط هذا الخيار الحد الأقصى لعدد البايتات التي سيحتفظ بها المخزن المؤقت الداخلي قبل إيقاف القراءات من المورد الأساسي. إذا حذفت هذا الخيار (أو مرّرت undefined)، فسيعود Node.js إلى قيمته الافتراضية المدمجة للتدفقات الثنائية القابلة للقراءة.
تصدير mime هو النسخة العامة من
وحدة mime على npm.
يُستخدم هذا لتهيئة أنواع MIME المرتبطة بامتدادات الملفات بالإضافة إلى خيارات أخرى لكيفية تحديد نوع MIME للملف (مثل النوع الافتراضي المستخدم لامتداد ملف غير معروف).
لا يقوم بـ إجراء تخزين مؤقت داخلي، يجب عليك استخدام ذاكرة تخزين مؤقت عكسية للوكيل مثل Varnish لهذا الغرض، أو تلك الأشياء الفاخرة المسماة CDNs. إذا كانت تطبيقك صغيرًا بما يكفي ليستفيد من التخزين المؤقت في ذاكرة عقدة واحدة، فهو صغير بما يكفي لعدم حاجته إلى التخزين المؤقت على الإطلاق ;).
لتمكين مخرجات أدوات التتبع debug() صدّر NODE_DEBUG:
$ NODE_DEBUG=send node app
$ npm install
$ npm test
هذا المثال البسيط سيرسل ملفًا محددًا إلى جميع الطلبات.
const http = require('node:http')
const send = require('send')
const server = http.createServer(async function onRequest (req, res) {
const { statusCode, headers, stream } = await send(req, '/path/to/index.html')
res.writeHead(statusCode, headers)
stream.pipe(res)
})
server.listen(3000)
هذا المثال البسيط سيقوم فقط بتقديم جميع الملفات في
دليل معين كمستوى أعلى. على سبيل المثال، طلب
GET /foo.txt سيعيد إرسال /www/public/foo.txt.
const http = require('node:http')
const parseUrl = require('parseurl')
const send = require('@fastify/send')
const server = http.createServer(async function onRequest (req, res) {
const { statusCode, headers, stream } = await send(req, parseUrl(req).pathname, { root: '/www/public' })
res.writeHead(statusCode, headers)
stream.pipe(res)
})
server.listen(3000)
const http = require('node:http')
const parseUrl = require('parseurl')
const send = require('@fastify/send')
// Default unknown types to text/plain
send.mime.default_type = 'text/plain'
// Add a custom type
send.mime.define({
'application/x-my-type': ['x-mt', 'x-mtt']
})
const server = http.createServer(function onRequest (req, res) {
const { statusCode, headers, stream } = await send(req, parseUrl(req).pathname, { root: '/www/public' })
res.writeHead(statusCode, headers)
stream.pipe(res)
})
server.listen(3000)
هذا مثال على تقديم بنية من الأدلة باستخدام دالة مخصصة لعرض قائمة محتويات دليل ما.
const http = require('node:http')
const fs = require('node:fs')
const parseUrl = require('parseurl')
const send = require('@fastify/send')