Node.js hızlı dosya sunucusu (HTTP üzerinden statik dosyalar)


642

npmHTTP üzerinden klasör içeriğini dosya sunucusu olarak göstermeme yardımcı olacak Node.js kullanıma hazır aracı (yüklü ) var mı?

Örnek, eğer

D:\Folder\file.zip
D:\Folder\file2.html
D:\Folder\folder\file-in-folder.jpg

Sonra başlayarak D:\Folder\ node node-file-server.js dosyaya

http://hostname/file.zip
http://hostname/file2.html
http://hostname/folder/file-in-folder.jpg

Düğüm statik dosya sunucum neden istekleri bırakıyor? bazı mistik referanslar

standart node.js statik dosya sunucusu

Böyle bir araç yoksa, hangi çerçeveyi kullanmalıyım?

İlgili: NodeJS'de temel statik dosya sunucusu


Bunu yapmanıza izin veren Cachemere adlı bir modül yazdım. Ayrıca tüm kaynaklarınızı otomatik olarak önbelleğe alır. Şuna
Jon

npmjs.com/package/local-web-server - hafif statik web sunucusu, sıfır yapılandırma
Victor

Yanıtlar:


1090

İyi bir "kullanıma hazır araç" seçeneği http-server olabilir:

npm install http-server -g

Kullanmak için:

cd D:\Folder
http-server

Veya şöyle:

http-server D:\Folder

Şuna göz atın: https://github.com/nodeapps/http-server


10
Bu harika. Herhangi bir nedenden ötürü bir adres bc belirtmem gerekiyordu, varsayılan 0.0.0.0, geliştirici ortamımla işbirliği yapmıyordu. http-server -a localhoster dun.
Sam Berry

41
kullanıyorumhttp-server -a localhost -p 80
Muhammed Umer

10
Tarayıcı senkronizasyonunu da kontrol etmeye değer , bu da aşağı yukarı aynı şeyi yapabilir, ancak dosyalar değiştirildiğinde canlı güncelleme bonusu ile.
Nick F

3
--corsAccess-Control-Allow-Origin:*yanıt üstbilgileriyle birlikte gönderilir (yani bir json dosyasına hizmet verirken)
Daniel F

9
npx http-server- npx, gerekli dosyaları indirip çalıştıran tek bir satıra dönüştürür.
Mike McKay

186

Hazır aracı kullanmak istemiyorsanız, aşağıdaki kodu https://developer.mozilla.org/tr-TR/docs/Node_server_without_framework adresinde gösterdiğim gibi kullanabilirsiniz :

var http = require('http');
var fs = require('fs');
var path = require('path');

http.createServer(function (request, response) {
    console.log('request starting...');

    var filePath = '.' + request.url;
    if (filePath == './')
        filePath = './index.html';

    var extname = path.extname(filePath);
    var contentType = 'text/html';
    switch (extname) {
        case '.js':
            contentType = 'text/javascript';
            break;
        case '.css':
            contentType = 'text/css';
            break;
        case '.json':
            contentType = 'application/json';
            break;
        case '.png':
            contentType = 'image/png';
            break;      
        case '.jpg':
            contentType = 'image/jpg';
            break;
        case '.wav':
            contentType = 'audio/wav';
            break;
    }

    fs.readFile(filePath, function(error, content) {
        if (error) {
            if(error.code == 'ENOENT'){
                fs.readFile('./404.html', function(error, content) {
                    response.writeHead(200, { 'Content-Type': contentType });
                    response.end(content, 'utf-8');
                });
            }
            else {
                response.writeHead(500);
                response.end('Sorry, check with the site admin for error: '+error.code+' ..\n');
                response.end(); 
            }
        }
        else {
            response.writeHead(200, { 'Content-Type': contentType });
            response.end(content, 'utf-8');
        }
    });

}).listen(8125);
console.log('Server running at http://127.0.0.1:8125/');

GÜNCELLEME Sunucunuza dış talep / dosyadan erişmeniz gerekiyorsa, burada önceki bir yanıtta belirttiğim gibi aşağıdakileri yazarak node.js dosyanızdaki CORS'nin üstesinden gelmeniz gerekir.

// Website you wish to allow to connect
response.setHeader('Access-Control-Allow-Origin', '*');

// Request methods you wish to allow
response.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

// Request headers you wish to allow
response.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
response.setHeader('Access-Control-Allow-Credentials', true);

GÜNCELLEME

Adrian'ın belirttiği gibi, yorumlarda, burada tam açıklama ile bir ES6 kodu yazdı , kodun herhangi bir nedenle orijinal siteden gitmesi durumunda, aşağıdaki kodunu tekrar gönderiyorum:

const http = require('http');
const url = require('url');
const fs = require('fs');
const path = require('path');
const port = process.argv[2] || 9000;

http.createServer(function (req, res) {
  console.log(`${req.method} ${req.url}`);

  // parse URL
  const parsedUrl = url.parse(req.url);
  // extract URL path
  let pathname = `.${parsedUrl.pathname}`;
  // based on the URL path, extract the file extention. e.g. .js, .doc, ...
  const ext = path.parse(pathname).ext;
  // maps file extention to MIME typere
  const map = {
    '.ico': 'image/x-icon',
    '.html': 'text/html',
    '.js': 'text/javascript',
    '.json': 'application/json',
    '.css': 'text/css',
    '.png': 'image/png',
    '.jpg': 'image/jpeg',
    '.wav': 'audio/wav',
    '.mp3': 'audio/mpeg',
    '.svg': 'image/svg+xml',
    '.pdf': 'application/pdf',
    '.doc': 'application/msword'
  };

  fs.exists(pathname, function (exist) {
    if(!exist) {
      // if the file is not found, return 404
      res.statusCode = 404;
      res.end(`File ${pathname} not found!`);
      return;
    }

    // if is a directory search for index file matching the extention
    if (fs.statSync(pathname).isDirectory()) pathname += '/index' + ext;

    // read file from file system
    fs.readFile(pathname, function(err, data){
      if(err){
        res.statusCode = 500;
        res.end(`Error getting the file: ${err}.`);
      } else {
        // if the file is found, set Content-type and send data
        res.setHeader('Content-type', map[ext] || 'text/plain' );
        res.end(data);
      }
    });
  });


}).listen(parseInt(port));

console.log(`Server listening on port ${port}`);

2
Şüphesiz, response.writeHead(200olmalı response.writeHead(404;)
Thomas Hunter II

14
Bu kod 127.0.0.1/../../../etc/passwd gibi bir şey yaparak dosya ağacının yukarı çıkmasına izin vermez mi? Buna karşı hiç kontrol görmüyorum.
Rolf

3
ES6 + sürümüyle ilgilenen biri varsa, MIME türlerini işleyen statik bir dosya sunucusu oluşturdum: gist.github.com/amejiarosario/53afae82e18db30dadc9bc39035778e5
Adrian

1
@Adrian Bu kod çok harika, ama onunla root erişimi elde etmenin bir yolunu buldum. Çözüm, dosya adındaki baştaki dönemlerin sayısını birle sınırlamaktır, böylece bir şey yapamazsınız ../../etc/password. gist.github.com/amejiarosario/53afae82e18db30dadc9bc39035778e5
Seph Reed

1
pathname = pathname.replace(/^(\.)+/, '.');
Seph Reed

79

NodeJS betiğinden çalıştırılabilen bir sunucu isteyen kişiler için:

Sen kullanabilirsiniz hizmet-statik / expressjs hangi cümledeki connect.static(artık bağlantı 3 olarak olan):

myapp.js:

var http = require('http');

var finalhandler = require('finalhandler');
var serveStatic = require('serve-static');

var serve = serveStatic("./");

var server = http.createServer(function(req, res) {
  var done = finalhandler(req, res);
  serve(req, res, done);
});

server.listen(8000);

ve sonra komut satırından:

  • $ npm install finalhandler serve-static
  • $ node myapp.js

1
FYI Bu benim için işe yaramadı. Dosya işleyicisini kullanarak kurdum npm install filehandlerve paket node_modulesdizinde listeleniyor . Ama myapp.jsdüğümü çalıştırdığımda bir hata atıyor diyerek Error: cannot find module filehandler. Dosya işleyicisini yüklemek için gereken ststment'i yorumlarsam, uygulama tam olarak sorunsuz çalışır, bu yüzden filhandler paketi ile ilgili bir sorun var gibi görünür. Bugün 12 Aralık 2014, bu yüzden bu yanıt gönderildikten sonra paket değişti mi?
Lee Jenkins

7
Bu finalişleyici değilfile
jakub.g

Bu çözümün bir başka avantajı da, dosyaların önbelleğe alınmamasıdır, bu nedenle kodda değişiklik yaparken bir işlemi yeniden başlatmanız gerekmez.
klimat

59

Düğüm olmadığını biliyorum, ama Python'un SimpleHTTPServer'ı kullandım:

python -m SimpleHTTPServer [port]

İyi çalışıyor ve Python ile geliyor.


16
Python3 eşdeğeri: python -m http.server [port](belirtilen Python2 içindir)
jakub.g

İşletim sistemi görüntüleri gibi büyük dosyalar sunmakla ilgili olduğunda Python benim için başarısız oluyor. Fedora 23
Zimy

9
Ve PHP'de:php -S localhost:8000
dennis

Bunu bir klasördeki içeriği her zaman hızlı bir şekilde sunmak için kullanıyorum.
Adrian Lynch

33

connect aradığınız şey olabilir.

Kolay kurulum:

npm install connect

Sonra en temel statik dosya sunucusu şöyle yazılabilir:

var connect = require('connect'),
    directory = '/path/to/Folder';

connect()
    .use(connect.static(directory))
    .listen(80);

console.log('Listening on port 80.');

4
Bu, bağlantı 3'ten itibaren açığa çıkmadığı için artık çalışmaz connect.static; değiştirme için aşağıdaki cevabımı görün
jakub.g

4
Ben hala varsayılan olarak express ile birlikte , ama gerçekten ayrı bir requireyetenek modülü "serve-statik" var olduğuna inanıyorum .
Oleg

18

Express'i npm kullanarak yükleyin: https://expressjs.com/en/starter/instal.html

Bu içeriğe sahip, index.html dosyanızın aynı düzeyinde server.js adlı bir dosya oluşturun:

var express = require('express');
var server = express();
server.use('/', express.static(__dirname + '/'));
server.listen(8080);

Farklı bir konuma yerleştirmek isterseniz, üçüncü satırdaki yolu ayarlayın:

server.use('/', express.static(__dirname + '/public'));

CD'yi dosyanızı içeren klasöre ekleyin ve bu komutla konsoldan düğümü çalıştırın:

node server.js

Localhost'a göz at: 8080


1
Merhaba, doğru çalıştırabilirim, ama gösteriyor Cannot GET /. Sunucuyu çalıştırmak için AWS EC2 kullanıyorum.
Wei Xia

1
@ Wei Merhaba, geç cevap. Hızlı bir Google aramasından görebildiğim kadarıyla dizin yapınız yanlış olabilir. Hedeflediğiniz yerde bir index.html dosyası olmalıdır. Yukarıdaki örneğin çalıştırılması 5 dakika sürmelidir ve olduğu gibi çalıştığını tekrar kontrol ettim. Buradan dizin yapınıza uyacak şekilde ince ayar yapabilir ve sunucunun sunucuya ihtiyaç duyduğu dosyaları bulup bulmadığını kontrol edebilirsiniz.
pasx

path.join(__dirname, 'public')daha çapraz platformdur.
sdgfsdh

17

Vaat yerine One-line ™ Provaları

resim açıklamasını buraya girin

Birincisi http-server, hs- link

npm i -g http-server   // install
hs C:\repos            // run with one line?? FTW!!

İkincisi serveZEIT.co tarafından - link

npm i -g serve         // install
serve C:\repos         // run with one line?? FTW!!

Karar vermenize yardımcı olan şey buysa, mevcut seçenekler aşağıdadır.

C: \ Kullanıcılar \ Qwerty> http-sunucusu --help
kullanım: http-sunucu [yol] [seçenekler]

seçenekleri:
  -p Kullanılacak bağlantı noktası [8080]
  -a Kullanılacak adres [0.0.0.0]
  -d Dizin listelerini göster [true]
  -i autoIndex'i göster [true]
  -g --gzip Mümkünse gzip dosyalarını sunma [false]
  -e --ext Sağlanmamışsa varsayılan dosya uzantısı [yok]
  -s --silent Günlük iletilerini çıktıdan kaldır
  --cors [= üstbilgiler] "Erişim-Denetim-İzin Verme Başlığı" üstbilgisi aracılığıyla CORS'yi etkinleştirme
                     İsteğe bağlı olarak virgülle ayrılmış CORS başlık listesi sağlayın
  -o [yol] Sunucuyu başlattıktan sonra tarayıcı penceresini aç
  -c Saniyede önbellek süresi (maks. yaş) [3600], örneğin -10 saniye boyunca -c10.
               Önbelleği devre dışı bırakmak için -c-1 kullanın.
  -U --utc Günlük iletilerinde UTC saat biçimini kullan.

  -P --proxy İstek çözülemezse yedek proxy. ör .: http://someurl.com

  -S --ssl https'yi etkinleştir.
  -C --cert SSL sertifikası dosyasının yolu (varsayılan: cert.pem).
  -K --key SSL anahtar dosyasının yolu (varsayılan: key.pem).

  -r --robots /robots.txt dosyasına yanıt ver [User-agent: * \ nDisallow: /]
  -h --help Bu listeyi yazdır ve çık.
C: \ Users \ Qwerty> hizmet --help

  Kullanım: serve.js [seçenekler] [komut]

  Komutlar:

    yardım Yardımı görüntüle

  Seçenekler:

    -a, --auth Temel yetkinin arkasında hizmet et
    -c, --cache Dosyaların tarayıcıda önbelleğe alınması için milisaniye cinsinden süre
    -n, --clipless Adresi panoya kopyalama (varsayılan olarak devre dışıdır)
    -C, --cors Kurulumu * Herhangi bir kaynaktan gelen isteklere izin vermek için CORS üstbilgileri (varsayılan olarak devre dışıdır)
    -h, --help Çıktı kullanım bilgileri
    -i, --ignore Yok sayılacak dosyalar ve dizinler
    -o, --open Yerel adresi tarayıcıda aç (varsayılan olarak devre dışıdır)
    -p, --port Dinlenecek bağlantı noktası (varsayılan 5000'dir)
    -S, --silent Konsola hiçbir şey kaydetme
    -s, --single Tek sayfa uygulamaları sunma (-c`yi 1 güne ayarlar)
    -t, --treeless Statik ağacını görüntüleme (varsayılan olarak devre dışıdır)
    -u, --unzipped GZIP sıkıştırmasını devre dışı bırak
    -v, --version Sürüm numarasını girin

Değişiklikleri izlemeniz gerekiyorsa hostr, Henry Tseng'in cevabına bakın


14

SADECE DEMO / PROTO SUNUCUSU

İhtiyacınız olan tek şey buysa, şunu deneyin:

const http = require('http');
const fs = require('fs');
const port = 3000;
const app = http.createServer((req,res) => {
    res.writeHead(200);
    if (req.url === '/') req.url = '/index.html'; // courtesy of @JosephCho
    res.end(fs.readFileSync(__dirname + req.url));
});

app.listen(port);

not: Adresinizin bir parçası olarak "/index.html" ifadesini kullanmanız gerekir, örneğin " http: // localhost: 3000 / index.html "


2
Senkronizasyon sürümünü kullanmayın. Bunun yerine, readStream öğesinden res için boru oluşturun.
Eduard Bondarenko

1
Hızlı ve kirli bir kerelik bir numara midilli gerekiyorsa en iyi cevap.
çöküş

1
Eğer kullanmaktan kaçınmak istiyorsanız index.htmladresinize bir parçası olarak sadece eklemek if (req.url === '/') req.url = '/index.html';hemen sonra res.writeHead(200);.
Joseph Cho

3
@EduardBondarenko haklı. const stream = fs.createReadStream(...); stream.pipe(res);gereken tek şey
Justin Meiners

8

Oldukça hoş olan başka bir statik web sunucusu var: tarayıcı senkronizasyonu.

Düğüm paketi yöneticisi kullanılarak indirilebilir:

npm install -g browser-sync

Kurulumdan sonra, cmd isteminde proje klasörüne gidin ve aşağıdakileri çalıştırın:

browser-sync start --server --port 3001 --files="./*"

Tarayıcıdaki geçerli klasördeki tüm dosyaları hazırlamaya başlayacaktır.

BrowserSync'ten daha fazla bilgi edinebilirsiniz

Teşekkürler.


2
Diğer statik sunucular yerine Browsersync kullanmanın avantajı, --filesbayrak tarafından belirtilen dosyalar değiştiğinde (nb. Belirtmeniz gerekmez ./*- yalnızca Browsersync'in güncellemeleri aktif olarak izlemesini istediğinizleri, örneğin canlı güncellemesidir. . css/*.css)
Nick F

7

Bu sayfadaki cevapların hiçbirinde çok şansım olmadı, ancak aşağıda hile yapmış gibiydi.

server.jsAşağıdaki içeriğe sahip bir dosya ekleyin :

const express = require('express')
const path = require('path')
const port = process.env.PORT || 3000
const app = express()

// serve static assets normally
app.use(express.static(__dirname + '/dist'))

// handle every other route with index.html, which will contain
// a script tag to your application's JavaScript file(s).
app.get('*', function (request, response){
  response.sendFile(path.resolve(__dirname, 'dist', 'index.html'))
})

app.listen(port)
console.log("server started on port " + port)

Ayrıca ihtiyacınız olduğundan emin olun express. Çalıştırın yarn add express --saveveya npm install express --savekurulumunuza bağlı olarak ( yarnoldukça hızlı bir şekilde önerebilirim ).

distİçeriğinize hangi klasörü sunuyorsanız değiştirebilirsiniz . Basit projem için herhangi bir klasörden hizmet vermiyordum, bu yüzden sadece distdosya adını kaldırdım .

O zaman koşabilirsin node server.js. Projemi bir Heroku sunucusuna yüklemem gerektiğinden, dosyama aşağıdakileri eklemem gerekiyordu package.json:

  "scripts": {
    "start": "node server.js"
  }

6

Eğer kullanırsanız Ekspres çerçevesini , bu işlevselliği gitmeye hazır geliyor.

Basit bir dosya sunma uygulaması kurmak için şunları yapın:

mkdir yourapp
cd yourapp
npm install express
node_modules/express/bin/express

Ben $ npm yükleme -g ekspres olabilir; Onları $ ekspres?
Paul Verest

Adımlarınızı takip ettim, ancak ekspresimin bin klasörü yok
Qwerty

6

İşte benim tek dosya / hafif node.js statik dosya web sunucusu evcil hayvan projesi, kullanımı bağımlı olmayan, Linux / Unix / macOS terminalinizde bu komutu vermek kadar kolay ve hızlı bir araç olduğuna inanıyorum. veya Android'de termux ) (node.js (veya nodejs-legacyDebian / Ubuntu üzerinde) yüklendiğinde):

curl pad.js.org | node 

(Windows kullanıcıları için belgelerde farklı komutlar bulunmaktadır)

Yararlı bulabileceğine inandığım farklı şeyleri destekliyor,

  • Hiyerarşik dizin dizini oluşturma / sunma
    • Farklı kriterlere göre sıralama özelliği ile
    • Chrome, Firefox ve diğer tarayıcılarda [çoklu dosya] sürükle ve bırak ve dosya / salt metin kopyalama-yapıştırma ve sistem panosu ekran görüntüsü yapıştırma ile tarayıcıdan yükleme bazı sınırlamalarla (komut satırı tarafından kapatılabilir) olabilir sunduğu seçenekler)
    • Klasör / not oluşturma / yükleme düğmesi
  • İyi bilinen dosya türleri için doğru MIME'leri sunmak (bunu devre dışı bırakma olasılığı ile)
  • Bir npm paketi ve yerel araç olarak kurulum imkanı veya Docker ile kalıcı bir hizmet olarak tek doğrusal kurulum
  • Daha hızlı aktarımlar için HTTP 206 dosya sunumu (çok parçalı dosya aktarımı)
  • Terminal ve tarayıcı konsolundan yüklemeler (aslında başlangıçta diğer sayfalarda / alanlarda tarayıcıların JS konsolu için bir dosya sistemi proxy'si olması amaçlanmıştır)
  • CORS indirme / yükleme (bu da kapatılabilir)
  • Kolay HTTPS entegrasyonu
  • Onunla daha güvenli hizmet verebilmek için hafif komut satırı seçenekleri:
    • Benim yama ile node.js 8 , ilk kurulum yapmadan seçeneklerine erişebilir:curl pad.js.org | node - -h
    • Veya önce sistem tarafından global bir npm paketi olarak yükleyin [sudo] npm install -g pad.jsve ardından seçeneklerine erişmek için yüklü sürümünü kullanın:pad -h
    • Veya varsayılan olarak nispeten güvenli seçenekler kullanan sağlanan Docker görüntüsünü kullanın. [sudo] docker run --restart=always -v /files:/files --name pad.js -d -p 9090:9090 quay.io/ebraminio/pad.js

Aracı kullanarak bir klasör dizininin ekran görüntüsü

Yukarıda açıklanan özellikler çoğunlukla kullandığım bazı güzel hile ile de araç kaynağının da servis edildiği yer olan http://pad.js.org aracının ana sayfasında belgelenmiştir !

Aracı kaynağı üzerindedir GitHub'dan görüşlerinizi, özellik istekleri ve ⭐s ağırlıyor hangi!


5

Npm@5.2.0, npmdenilen her zamanki npm yanında yeni bir ikili yüklemeye başladı npx. Şimdi, bir dizin geçerli dizinden statik http sunucusu oluşturmak için:

npx serve

veya

npx http-server

4

Statik kaynaklara hizmet etmek için düğüm kullanarak performansın sağlıklı bir şekilde artması için, Buffet kullanmanızı öneririz . Önbellek HTTP ters proxy olarak da bilinen bir web uygulaması hızlandırıcısı gibi çalışır, ancak seçilen dizini belleğe yükler.

Büfe tamamen arabelleğe alınmış bir yaklaşım benimser - uygulamanız önyüklendiğinde tüm dosyalar belleğe tamamen yüklenir, böylece dosya sisteminin yanmasını asla hissetmezsiniz. Uygulamada, bu son derece verimlidir. Öyle ki, Vernik'i uygulamanızın önüne koymak daha da yavaşlatabilir! 

CodePile sitesinde kullanıyoruz ve 1k eşzamanlı kullanıcı bağlantı yükü altında 25 kaynak indiren bir sayfada ~ 700 istek / sn'den> 4k istek / sn'lik bir artış bulduk.

Misal:

var server = require('http').createServer();

var buffet = require('buffet')(root: './file'); 

 

server.on('request', function (req, res) {

  buffet(req, res, function () {

    buffet.notFound(req, res);

  });

});

 

server.listen(3000, function () {

  console.log('test server running on port 3000');

});


4

Aşağıda benim için çalıştı:

app.jsAşağıdaki içeriğe sahip bir dosya oluşturun :

// app.js

var fs = require('fs'),
    http = require('http');

http.createServer(function (req, res) {
  fs.readFile(__dirname + req.url, function (err,data) {
    if (err) {
      res.writeHead(404);
      res.end(JSON.stringify(err));
      return;
    }
    res.writeHead(200);
    res.end(data);
  });
}).listen(8080);

index.htmlAşağıdaki içeriğe sahip bir dosya oluşturun :

Hi

Bir komut satırı başlatın:

cmd

Aşağıdakileri çalıştırın cmd:

node app.js

Chrome'da URL'nin altına gidin:

http://localhost:8080/index.html

Bu kadar. Umarım yardımcı olur.

Kaynak: https://nodejs.org/en/knowledge/HTTP/servers/how-to-serve-static-files/


3

Bana hizmet etmeyi deneyebilirsin

Kullanımı çok kolaydır:

ServeMe = require('serve-me')();
ServeMe.start(3000);

Bu kadar.

PD: Varsayılan olarak sunulan klasör "genel" dir.



3

Düz node.js'de:

const http = require('http')
const fs = require('fs')
const path = require('path')

process.on('uncaughtException', err => console.error('uncaughtException', err))
process.on('unhandledRejection', err => console.error('unhandledRejection', err))

const publicFolder = process.argv.length > 2 ? process.argv[2] : '.'
const port = process.argv.length > 3 ? process.argv[3] : 8080

const mediaTypes = {
  zip: 'application/zip',
  jpg: 'image/jpeg',
  html: 'text/html',
  /* add more media types */
}

const server = http.createServer(function(request, response) {
  console.log(request.method + ' ' + request.url)

  const filepath = path.join(publicFolder, request.url)
  fs.readFile(filepath, function(err, data) {
    if (err) {
      response.statusCode = 404
      return response.end('File not found or you made an invalid request.')
    }

    let mediaType = 'text/html'
    const ext = path.extname(filepath)
    if (ext.length > 0 && mediaTypes.hasOwnProperty(ext.slice(1))) {
      mediaType = mediaTypes[ext.slice(1)]
    }

    response.setHeader('Content-Type', mediaType)
    response.end(data)
  })
})

server.on('clientError', function onClientError(err, socket) {
  console.log('clientError', err)
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n')
})

server.listen(port, '127.0.0.1', function() {
  console.log('👨‍🔧 Development server is online.')
})

Bu, yalnızca belirli bir dizinde istenen dosyaları sunan basit bir node.js sunucusudur.

Kullanımı:

node server.js folder port

folderserver.jsyere bağlı olarak mutlak veya göreli olabilir . Varsayılan değer, komutu .yürüttüğünüz dizindir node server.js.

port varsayılan olarak 8080'dir, ancak işletim sisteminizde bulunan herhangi bir bağlantı noktasını belirleyebilirsiniz.

Senin durumunda, yapardım:

cd D:\Folder
node server.js

Altındaki dosyalara D:\Folderbir tarayıcıdan göz atabilirsiniz.http://127.0.0.1:8080/somefolder/somefile.html


2

Henüz NPM'de değil, ancak Express'te form gönderimlerini kabul etmenizi ve işlemsel bir e-posta hizmeti aracılığıyla e-posta göndermenizi sağlayan basit bir statik sunucu oluşturdum (Şimdilik Sendgrid, Mandrill geliyor).

https://github.com/jdr0dn3y/nodejs-StatServe


2

Arayanların yararı için Jakub g'nin cevabını beğendim, ancak küçük bir hata işleme istedim. Açıkçası , hataları düzgün bir şekilde ele almak en iyisidir , ancak bu, bir hata oluştuğunda sitenin durmasını önlemeye yardımcı olacaktır. Aşağıdaki kod:

var http = require('http');
var express = require('express');

process.on('uncaughtException', function(err) {
  console.log(err);
});

var server = express();

server.use(express.static(__dirname));

var port = 10001;
server.listen(port, function() { 
    console.log('listening on port ' + port);     
    //var err = new Error('This error won't break the application...')
    //throw err
});

Güncelleme - Cevabım çalışıyor, ancak şimdi @Matt Self'in http sunucusunu kullanma cevabını kullanıyorum. Gayet iyi görünüyor.
HokeyJ

2

İlk önce nog-statik sunucusunu npm install node-static -g -g ile kurun, sisteminize global olarak yükleyin, ardından dosyalarınızın bulunduğu dizine gidin, sunucuyu static 8080 bağlantı noktasında dinler, tarayıcıya naviaget yazın ve localhost yazın: 8080 / yourhtmlfilename .


2

Sen NPM kullanabilirsiniz hizmet size NodeJS gerekmiyorsa o hızlıdır şeyler ve kolay kullanım aracı, bunun için paket:

1 - Paketi PC'nize yükleyin:

npm install -g serve

2 - Statik klasörünüzü aşağıdakilerle sunun serve <path>:

d:> serve d:\StaticSite

Statik klasörünüzün hangi bağlantı noktasına sunulduğunu size gösterecektir, sadece aşağıdaki gibi ana bilgisayara gidin:

http://localhost:3000

Bunun npmdüğüm paketi yöneticisi olduğunu biliyorsunuz, bu yüzden aslında NodeJS malzemelerini kullanıyorsunuz
derickito

Yaptığım, "NodeJS şeyler" olarak kastettiğim, önerilen çoğu yanıt gibi dosyaları sunmak için NodeJS ve express kullanıyordu. Serve bağımsız bir yürütülebilir dosyadır, NPM sadece yüklemek için kullanılır, sadece doğrudan indirebilirsiniz.
Diego Mendes

1

NPM kayıt defterinde arama yapmak https://npmjs.org/search?q=server , statik sunucuyu buldum https://github.com/maelstrom/static-server

Hiç bir meslektaşınıza bir dosya göndermeniz gerekiyordu, ancak 100 MB'lık canavara e-posta göndermekten rahatsız edilemiyor musunuz? Basit bir JavaScript uygulaması örneği çalıştırmak istedim, ancak dosyayı /// protokolü üzerinden çalıştırmakla ilgili sorunlarınız mı var? Medya dizininizi Samba veya FTP kurmadan veya yapılandırma dosyalarını düzenlemenizi gerektiren başka bir şey olmadan LAN'da paylaşmak mı istiyorsunuz? O zaman bu dosya sunucusu hayatınızı biraz daha kolaylaştıracaktır.

Basit statik malzeme sunucusunu kurmak için npm kullanın:

npm install -g static-server

Sonra bir dosyaya veya dizine hizmet vermek için

$ serve path/to/stuff
Serving path/to/stuff on port 8001

Bu klasör içeriğini bile listeleyebilir.

Ne yazık ki, dosyalara hizmet veremedi :)


5
O sunucuyu kurdum. Bu dosya sunucusu Düğümün çok eski bir sürümüne göre oluşturuldu, bu yüzden neden artık çalışmıyor. Bunu düzeltmek için şu an zamanım yok. Yukarıdaki @Oleg tarafından verilen yanıtı kullanmanızı öneririm. Kolayca küçük bir düğüm çalıştırılabilir olarak paketlenebilir ve aslında benimki zaten yaptı.
Tim Heap

Teşekkür ederim Tim, çok profesyonel yanıt. Ben olsa kodu silmek olmaz, ama benioku güncelleyin.
Paul Verest



1

const http = require('http');
const fs = require('fs');
const url = require('url');
const path = require('path');


let mimeTypes = {
  '.html': 'text/html',
  '.css': 'text/css',
  '.js': 'text/javascript',
  '.jpg': 'image/jpeg',
  '.png': 'image/png',
  '.ico': 'image/x-icon',
  '.svg': 'image/svg+xml',
  '.eot': 'appliaction/vnd.ms-fontobject',
  '.ttf': 'aplication/font-sfnt'
};



http.createServer(function (request, response) {
  let pathName = url.parse(request.url).path;
  if(pathName === '/'){
    pathName = '/index.html';
  }
  pathName = pathName.substring(1, pathName.length);
  let extName = path.extName(pathName);
  let staticFiles = `${__dirname}/template/${pathName}`;

      if(extName =='.jpg' || extName == '.png' || extName == '.ico' || extName == '.eot' || extName == '.ttf' || extName == '.svg')
      {
          let file = fr.readFileSync(staticFiles);
          res.writeHead(200, {'Content-Type': mimeTypes[extname]});
          res.write(file, 'binary');
          res.end();
      }else {
        fs.readFile(staticFiles, 'utf8', function (err, data) {
          if(!err){
            res.writeHead(200, {'Content-Type': mimeTypes[extname]});
            res.end(data);
          }else {
            res.writeHead(404, {'Content-Type': 'text/html;charset=utf8'});
            res.write(`<strong>${staticFiles}</strong>File is not found.`);
          }
          res.end();
        });
      }
}).listen(8081);


Bu kodla bir açıklama alog eklemeniz gerekir.
Abhinav Gauniyal



0

Ayrıca, isteklerin neden düştüğünü de sordunuz - durumunuzdaki belirli nedenin ne olduğundan emin değilsiniz, ancak Düğüm bu ağ modeli için gerçekten optimize edilmediğinden, genel olarak özel ara katman yazılımı (nginx, S3, CDN) kullanarak daha iyi sunucu statik içeriği elde edersiniz. Daha fazla açıklamaya buradan bakın (madde işareti 13): http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.