
Node.js लाइब्रेरी जो फ़ाइलों को HTTP प्रतिक्रियाओं के रूप में स्ट्रीम करने के लिए है, जिसमें आंशिक सामग्री, सशर्त अनुरोध और कॉन्फ़िगरेबल कैशिंग हेडर का समर्थन है। वेब फ्रेमवर्क जैसे Fastify में उपयोग के लिए डिज़ाइन किया गया है।
Send एक लाइब्रेरी है जो फ़ाइल सिस्टम से फ़ाइलों को HTTP प्रतिक्रिया के रूप में स्ट्रीम करने के लिए है, जो आंशिक प्रतिक्रियाओं (Ranges), conditional-GET negotiation (If-Match, If-Unmodified-Since, If-None-Match, If-Modified-Since), उच्च परीक्षण कवरेज, और विस्तृत घटनाओं का समर्थन करती है जिनका उपयोग आपके एप्लिकेशन या फ़्रेमवर्क में उपयुक्त कार्रवाई करने के लिए किया जा सकता है।
यह एक Node.js मॉड्यूल है जो npm रजिस्ट्री के माध्यम से उपलब्ध है। स्थापना npm install कमांड का उपयोग करके की जाती है:
$ npm install @fastify/send
यदि TypeScript का उपयोग करना चाहते हैं तो @types/mime@3 का उपयोग करना आवश्यक है;
@types/mime@4 ने mime प्रकारों को हटा दिया है।
$ npm install -D @types/mime@3
const send = require('@fastify/send')
दिए गए पथ के लिए statusCode, headers, और stream प्रदान करता है ताकि इसे res पर भेजा जा सके। req Node.js HTTP अनुरोध है और path भेजने के लिए urlencoded पथ है (urlencoded, वास्तविक फ़ाइल-सिस्टम पथ नहीं)।
रेंज्ड अनुरोधों को स्वीकार करना सक्षम या अक्षम करें, डिफ़ॉल्ट true है। इसे अक्षम करने पर Accept-Ranges नहीं भेजा जाएगा और Range अनुरोध हेडर की सामग्री को अनदेखा किया जाएगा।
Cache-Control प्रतिक्रिया हेडर सेट करना सक्षम या अक्षम करें, डिफ़ॉल्ट true है। इसे अक्षम करने पर immutable और maxAge विकल्पों को अनदेखा किया जाएगा।
डिफ़ॉल्ट रूप से, यह लाइब्रेरी अनुरोधित फ़ाइल के फ़ाइल एक्सटेंशन के आधार पर प्रतिक्रिया का Content-Type सेट करने के लिए mime मॉड्यूल का उपयोग करती है।
इस कार्यक्षमता को अक्षम करने के लिए, contentType को false पर सेट करें। यदि अक्षम किया गया है तो Content-Type हेडर को मैन्युअल रूप से सेट करना होगा।
जब "डॉटफ़ाइल्स" का सामना होता है तो उनके साथ कैसे व्यवहार किया जाए यह सेट करें। डॉटफ़ाइल एक फ़ाइल या निर्देशिका है जो डॉट (".") से शुरू होती है। ध्यान दें कि यह जाँच पथ पर ही की जाती है बिना यह देखे कि पथ डिस्क पर मौजूद है या नहीं। यदि root निर्दिष्ट है, तो केवल रूट के ऊपर के डॉटफ़ाइल्स की जाँच की जाती है (अर्थात रूट स्वयं एक डॉटफ़ाइल के अंदर हो सकता है जब इसे "deny" पर सेट किया गया हो)।
'allow' डॉटफ़ाइल्स के लिए कोई विशेष उपचार नहीं।'deny' किसी भी डॉटफ़ाइल के अनुरोध के लिए 403 भेजें।'ignore' ऐसा दिखाएँ जैसे डॉटफ़ाइल मौजूद नहीं है और 404 भेजें।डिफ़ॉल्ट मान 'ignore' के समान है, इस अपवाद के साथ कि यह डिफ़ॉल्ट डॉट से शुरू होने वाली निर्देशिका के अंदर की फ़ाइलों को अनदेखा नहीं करेगा, पिछड़ी-संगतता के लिए।
बाइट ऑफ़सेट जिस पर स्ट्रीम समाप्त होती है, डिफ़ॉल्ट फ़ाइल की लंबाई माइनस 1 है। अंत स्ट्रीम में शामिल है, जिसका अर्थ है end: 3 स्ट्रीम में चौथा बाइट शामिल करेगा।
etag जनरेशन को सक्षम या अक्षम करें, डिफ़ॉल्ट true है।
यदि दी गई फ़ाइल मौजूद नहीं है, तो दिए गए एक्सटेंशन को दिए गए क्रम में जोड़ने का प्रयास करें। डिफ़ॉल्ट रूप से, यह अक्षम है (false पर सेट)। एक उदाहरण मान जो एक्सटेंशन-रहित HTML फ़ाइलों की सेवा करेगा: ['html', 'htm']। यदि अनुरोधित फ़ाइल में पहले से ही एक एक्सटेंशन है तो इसे छोड़ दिया जाता है।
Cache-Control प्रतिक्रिया हेडर में immutable निर्देश को सक्षम या अक्षम करें, डिफ़ॉल्ट false है। यदि true पर सेट किया गया है, तो कैशिंग सक्षम करने के लिए maxAge विकल्प भी निर्दिष्ट किया जाना चाहिए। immutable निर्देश समर्थित क्लाइंट को maxAge विकल्प के जीवनकाल के दौरान यह जाँचने के लिए सशर्त अनुरोध करने से रोकेगा कि फ़ाइल बदली है या नहीं।
डिफ़ॉल्ट रूप से send "index.html" फ़ाइलों का समर्थन करता है, इसे अक्षम करने के लिए false सेट करें या एक नया इंडेक्स प्रदान करने के लिए पसंदीदा क्रम में एक स्ट्रिंग या सरणी पास करें।
Last-Modified हेडर को सक्षम या अक्षम करें, डिफ़ॉल्ट true है। फ़ाइल सिस्टम के अंतिम संशोधित मान का उपयोग करता है।
HTTP कैशिंग के लिए मिलीसेकंड में अधिकतम आयु प्रदान करें, डिफ़ॉल्ट 0 है। यह ms मॉड्यूल द्वारा स्वीकार किया जाने वाला एक स्ट्रिंग भी हो सकता है।
अधिकतम प्रतिक्रिया सामग्री आकार निर्दिष्ट करें, डिफ़ॉल्ट संपूर्ण फ़ाइल आकार है। इसका उपयोग तब किया जाएगा जब acceptRanges true हो।
फ़ाइलों को path के सापेक्ष परोसें।
बाइट ऑफ़सेट जिस पर स्ट्रीम शुरू होती है, डिफ़ॉल्ट 0 है। शुरुआत शामिल है, जिसका अर्थ है start: 2 स्ट्रीम में तीसरा बाइट शामिल करेगा।
जब प्रदान किया जाता है, तो यह विकल्प अंतर्निहित संसाधन से पढ़ने को रोकने से पहले आंतरिक बफर द्वारा रखे जाने वाले बाइट्स की अधिकतम संख्या निर्धारित करता है। यदि आप इस विकल्प को छोड़ते हैं (या undefined पास करते हैं), तो Node.js पठनीय बाइनरी स्ट्रीम के लिए अपने अंतर्निहित डिफ़ॉल्ट पर वापस आ जाता है।
mime निर्यात mime npm मॉड्यूल का वैश्विक उदाहरण है।
इसका उपयोग MIME प्रकारों को कॉन्फ़िगर करने के लिए किया जाता है जो फ़ाइल एक्सटेंशन से जुड़े होते हैं, साथ ही फ़ाइल के MIME प्रकार को हल करने के अन्य विकल्पों (जैसे अज्ञात फ़ाइल एक्सटेंशन के लिए उपयोग करने के लिए डिफ़ॉल्ट प्रकार) के लिए किया जाता है।
यह आंतरिक कैशिंग नहीं करता है, आपको इसके लिए Varnish जैसे रिवर्स प्रॉक्सी कैश, या CDN नामक उन फैंसी चीज़ों का उपयोग करना चाहिए। यदि आपका एप्लिकेशन इतना छोटा है कि वह सिंगल-नोड मेमोरी कैशिंग से लाभान्वित हो सकता है, तो वह इतना छोटा है कि उसे किसी कैशिंग की आवश्यकता ही नहीं है ;)।
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')
// Transfer arbitrary files from within /www/example.com/public/*
// with a custom handler for directory listing
const server = http.createServer(async function onRequest (req, res) {
const { statusCode, headers, stream, type, metadata } = await send(req, parseUrl(req).pathname, { index: false, root: '/www/public' })
if(type === 'directory') {
// get directory list
const list = await readdir(metadata.path)
// render an index for the directory
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' })
res.end(list.join('\n') + '\n')
} else {
res.writeHead(statusCode, headers)
stream.pipe(res)
}
})
server.listen(3000)
const http = require('node:http')
const parseUrl = require('parseurl')
const send = require('@fastify/send')
const server = http.createServer(async function onRequest (req, res) {
// transfer arbitrary files from within
// /www/example.com/public/*
const { statusCode, headers, stream, type, metadata } = await send(req, parseUrl(req).pathname, { root: '/www/public' })
switch (type) {
case 'directory': {
// your custom directory handling logic:
res.writeHead(301, {
'Location': metadata.requestPath + '/'
})
res.end('Redirecting to ' + metadata.requestPath + '/')
break
}
case 'error': {
// your custom error-handling logic:
res.writeHead(metadata.error.status ?? 500, {})
res.end(metadata.error.message)
break
}
default: {
// your custom headers
// serve all files for download
res.setHeader('Content-Disposition', 'attachment')
res.writeHead(statusCode, headers)
stream.pipe(res)
}
}
})
server.listen(3000)
MIT के तहत लाइसेंस प्राप्त।