Server file cepat Node.js (file statis melalui HTTP)

642

Apakah ada alat siap pakai Node.js (diinstal dengan npm), yang akan membantu saya mengekspos konten folder sebagai server file melalui HTTP.

Contoh, jika saya punya

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

Kemudian mulai D:\Folder\ node node-file-server.js saya bisa mengakses file melalui

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

Mengapa node saya menjatuhkan permintaan server file statis? referensi beberapa mistis

server file statis node.js standar

Jika tidak ada alat seperti itu, kerangka apa yang harus saya gunakan?

Terkait: Server file statis dasar di NodeJS

Paul Verest
sumber
Saya menulis sebuah modul bernama Cachemere yang memungkinkan Anda melakukan ini. Itu juga secara otomatis cache semua sumber daya Anda. Lihat ini: github.com/topcloud/cachemere
Jon
npmjs.com/package/local-web-server - server web statis ringan, konfigurasi nol
Victor

Jawaban:

1091

Opsi "alat siap pakai" yang bagus bisa berupa http-server:

npm install http-server -g

Untuk menggunakannya:

cd D:\Folder
http-server

Atau, seperti ini:

http-server D:\Folder

Lihat itu: https://github.com/nodeapps/http-server

Matt Self
sumber
10
Ini luar biasa. Saya perlu menentukan alamat bc karena alasan tertentu 0.0.0.0 default tidak bekerja sama dengan lingkungan dev saya. http-server -a localhostpunya er dun.
Sam Berry
41
saya menggunakanhttp-server -a localhost -p 80
Muhammad Umer
10
Layak juga memeriksa sinkronisasi browser , yang dapat melakukan lebih atau kurang hal yang sama tetapi dengan bonus tambahan dari pembaruan langsung ketika file diubah.
Nick F
3
--corsuntuk mengirim Access-Control-Allow-Origin:*bersama dengan header respons (yaitu ketika melayani file json)
Daniel F
9
npx http-server- npx mengubahnya menjadi satu-liner yang mengunduh file yang diperlukan dan menjalankannya.
Mike McKay
186

Jika Anda tidak ingin menggunakan alat siap pakai, Anda dapat menggunakan kode di bawah ini, seperti yang ditunjukkan oleh saya di https://developer.mozilla.org/en-US/docs/Node_server_without_framework :

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/');

PEMBARUAN Jika Anda perlu mengakses server Anda dari permintaan / file eksternal, Anda perlu mengatasi CORS, dalam file node.js Anda dengan menulis di bawah ini, seperti yang saya sebutkan dalam jawaban sebelumnya di sini

// 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);

MEMPERBARUI

Seperti yang disebutkan Adrian, dalam komentarnya, dia menulis kode ES6 dengan penjelasan lengkap di sini , saya hanya memposting ulang kodenya di bawah, jika kode tersebut hilang dari situs asli dengan alasan apa pun:

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}`);
Hasan A Yousef
sumber
2
Tentunya, response.writeHead(200seharusnya response.writeHead(404;)
Thomas Hunter II
14
Apakah kode itu tidak mengizinkan naik pohon file dengan melakukan sesuatu seperti 127.0.0.1/../../../etc/passwd ? Saya tidak melihat ada cek yang menentangnya.
Rolf
3
Jika ada yang tertarik dengan versi ES6 +, saya membuat server file statis yang menangani tipe MIME: gist.github.com/amejiarosario/53afae82e18db30dadc9bc39035778e5
Adrian
1
@Adrian Kode ini sangat mengagumkan, tetapi saya telah menemukan cara untuk mendapatkan akses root dengannya. Solusinya adalah membatasi jumlah periode terkemuka pada nama file menjadi satu sehingga Anda tidak dapat melakukan ../../etc/passwordhal - hal. gist.github.com/amejiarosario/53afae82e18db30dadc9bc39035778e5
Seph Reed
1
pathname = pathname.replace(/^(\.)+/, '.');
Seph Reed
79

Untuk orang yang menginginkan server dapat dijalankan dari dalam skrip NodeJS:

Anda dapat menggunakan expressjs / serve-static yang menggantikan connect.static(yang tidak lagi tersedia pada koneksi 3):

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);

dan kemudian dari baris perintah:

  • $ npm install finalhandler serve-static
  • $ node myapp.js
jakub.g
sumber
1
FYI Ini tidak berhasil untuk saya. Saya menginstal filehandler menggunakan npm install filehandlerdan paket terdaftar di node_modulesdirektori. Tetapi ketika saya menjalankan myapp.jsnode melempar kesalahan, mengatakan Error: cannot find module filehandler. Jika saya mengomentari ststment yang diperlukan untuk memuat filehandler, aplikasi ini memuat statis-servis dengan baik, jadi sepertinya ada sesuatu yang salah dengan paket filhandler. Hari ini tanggal 12 Desember 2014, jadi mungkin paketnya sudah berubah sejak jawaban ini diposting?
Lee Jenkins
7
Ini finalhandler tidakfile
jakub.g
Keuntungan lain dari solusi ini adalah, file tidak di-cache, jadi Anda tidak perlu memulai kembali proses ketika membuat perubahan dalam kode.
klimat
59

Saya tahu ini bukan Node, tapi saya telah menggunakan SimpleHTTPServer Python:

python -m SimpleHTTPServer [port]

Ini bekerja dengan baik dan dilengkapi dengan Python.

Matt Sersan
sumber
16
Setara dengan Python3: python -m http.server [port](yang disebutkan adalah untuk Python2)
jakub.g
Python gagal untuk saya ketika melayani file besar seperti gambar OS. Fedora 23
Zimy
9
Dan di PHP:php -S localhost:8000
dennis
Saya menggunakan ini untuk dengan cepat menyajikan konten dari folder setiap saat.
Adrian Lynch
33

terhubung bisa menjadi apa yang Anda cari.

Dipasang dengan mudah dengan:

npm install connect

Kemudian file server statis paling dasar dapat ditulis sebagai:

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

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

console.log('Listening on port 80.');
Oleg
sumber
4
Ini tidak berfungsi lagi pada saat menghubungkan 3 karena tidak mengekspos connect.static; lihat jawaban saya di bawah ini untuk pengganti
jakub.g
4
Saya percaya bahwa itu masih dibundel dengan express secara default, tetapi memang ada sekarang dalam requiremodul mampu terpisah "melayani-statis".
Oleg
18

Instal express menggunakan npm: https://expressjs.com/en/starter/installing.html

Buat file bernama server.js di tingkat yang sama dengan index.html Anda dengan konten ini:

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

Jika Anda ingin meletakkannya di lokasi yang berbeda, setel path di baris ketiga:

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

CD ke folder yang berisi file Anda dan jalankan node dari konsol dengan perintah ini:

node server.js

Telusuri ke localhost: 8080

pasx
sumber
1
Hai, saya bisa menjalankannya dengan benar, tetapi ini menunjukkan Cannot GET /. Saya menggunakan AWS EC2 untuk menjalankan server.
Wei Xia
1
@ Hai Hai, jawaban terlambat. Dari apa yang saya lihat dari pencarian Google cepat sepertinya struktur direktori Anda mungkin salah. Harus ada file index.html di lokasi yang Anda targetkan. Menyiapkan contoh di atas untuk menjalankan harus memakan waktu 5 menit dan saya periksa kembali apakah berfungsi sebagaimana mestinya. Dari sana Anda dapat mengubah jalur yang sesuai dengan struktur direktori Anda dan memeriksa apakah server masih menemukan file yang diperlukan untuk server.
pasx
path.join(__dirname, 'public')lebih lintas platform.
sdgfsdh
17

Satu-baris ™ Bukti alih-alih janji

masukkan deskripsi gambar di sini

Yang pertama adalah http-server, hs- tautan

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

Yang kedua adalah servedengan ZEIT.co - link

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

Berikut ini adalah opsi yang tersedia, jika ini yang membantu Anda memutuskan.

C: \ Users \ Qwerty> http-server --help
penggunaan: http-server [jalur] [opsi]

pilihan:
  Port -p untuk menggunakan [8080]
  -Alamat untuk menggunakan [0.0.0.0]
  -d Tampilkan daftar direktori [true]
  -i Menampilkan autoIndex [true]
  -g --gzip Sajikan file gzip bila memungkinkan [salah]
  -e --ext Ekstensi file default jika tidak ada yang disediakan [tidak ada]
  -s --silent Menekan pesan log dari output
  --cors [= header] Mengaktifkan CORS melalui tajuk "Access-Control-Allow-Origin"
                     Secara opsional sediakan daftar tajuk CORS yang dipisahkan oleh koma
  -o [path] Buka jendela browser setelah memulai server
  -c Waktu cache (usia maks) dalam detik [3600], misalnya -c10 selama 10 detik.
               Untuk menonaktifkan caching, gunakan -c-1.
  -U --utc Menggunakan format waktu UTC dalam pesan log.

  -P --proxy Fallback proxy jika permintaan tidak dapat diselesaikan. misalnya: http://someurl.com

  -S --ssl Mengaktifkan https.
  -C --cert Path ke file ssl cert (default: cert.pem).
  -K --key Path ke file kunci ssl (default: key.pem).

  -r --robots Tanggapi /robots.txt [User-agent: * \ nDisarang: /]
  -h --help Cetak daftar ini dan keluar.
C: \ Users \ Qwerty> serve --help

  Penggunaan: serve.js [opsi] [perintah]

  Perintah:

    bantuan Menampilkan bantuan

  Pilihan:

    -a, --auth Sajikan di belakang auth dasar
    -c, --cache Waktu dalam milidetik untuk menyimpan file dalam browser
    -n, --clipless Jangan menyalin alamat ke clipboard (dinonaktifkan secara default)
    -C, --cors Setup * CORS header untuk memungkinkan permintaan dari asal mana pun (dinonaktifkan secara default)
    -h, --help Output informasi penggunaan
    -i, --ignore File dan direktori untuk diabaikan
    -o, --open Buka alamat lokal di browser (dinonaktifkan secara default)
    -p, --port Port untuk didengarkan (default ke 5000)
    -S, --silent Jangan login apa pun ke konsol
    -s, --single Sajikan aplikasi satu halaman (set `-c` hingga 1 hari)
    -t, --treeless Jangan tampilkan pohon statika (dinonaktifkan secara default)
    -u, --unzipped Nonaktifkan kompresi GZIP
    -v, --versi Output nomor versi

Jika Anda perlu melihat perubahan, lihat hostr, kredit jawaban Henry Tseng

Qwerty
sumber
14

HANYA DEMO / PROTO SERVER

Jika itu yang Anda butuhkan, coba ini:

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);

catatan: Anda perlu menggunakan "/index.html" sebagai bagian dari alamat Anda yaitu " http: // localhost: 3000 / index.html "

Jacksonkr
sumber
2
Jangan gunakan versi sinkronisasi. Alirkan membuat pipa untuk res dari readStream.
Eduard Bondarenko
1
Jawaban terbaik jika Anda membutuhkan kuda poni satu trik yang cepat & kotor.
collapsar
1
Jika Anda ingin menghindari penggunaan index.htmlsebagai bagian dari alamat Anda, tambahkan saja if (req.url === '/') req.url = '/index.html';setelahnya res.writeHead(200);.
Joseph Cho
3
@EduardBondarenko benar. const stream = fs.createReadStream(...); stream.pipe(res);adalah yang Anda butuhkan
Justin Meiners
8

Ada server web statis lain yang cukup bagus: browser-sync.

Itu dapat diunduh menggunakan manajer paket simpul:

npm install -g browser-sync

Setelah instalasi, navigasikan ke folder proyek di cmd prompt dan jalankan saja yang berikut:

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

Ini akan mulai melayani semua file di folder saat ini di browser.

Lebih banyak dapat ditemukan dari BrowserSync

Terima kasih.

Samrat Debroy
sumber
2
Keuntungan menggunakan Browsersync daripada server statis lainnya adalah ia langsung memperbarui halaman setiap kali file yang ditentukan oleh --filesflag berubah (nb. Anda tidak perlu menentukan ./*- hanya yang Anda inginkan agar Browsersync secara aktif mengawasi pembaruan, misalnya . css/*.css)
Nick F
7

Saya belum beruntung dengan salah satu jawaban di halaman ini, namun, di bawah ini sepertinya berhasil.

Tambahkan server.jsfile dengan konten berikut:

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)

Pastikan juga Anda membutuhkannya express. Jalankan yarn add express --saveatau npm install express --savetergantung pada pengaturan Anda (saya dapat merekomendasikan yarnitu cukup cepat).

Anda dapat mengubah distke folder apa pun yang Anda sajikan. Untuk proyek sederhana saya, saya tidak melayani dari folder apa pun, jadi saya cukup menghapus distnama file.

Maka Anda dapat lari node server.js. Karena saya harus mengunggah proyek saya ke server Heroku, saya perlu menambahkan yang berikut ke package.jsonfile saya :

  "scripts": {
    "start": "node server.js"
  }
FooBar
sumber
6

Jika Anda menggunakan kerangka kerja Express , fungsi ini siap untuk digunakan.

Untuk menyiapkan aplikasi penyajian file sederhana lakukan ini:

mkdir yourapp
cd yourapp
npm install express
node_modules/express/bin/express
Daniel
sumber
Bisakah saya $ npm menginstal -g express; mereka $ ekspres?
Paul Verest
Saya mengikuti langkah-langkah Anda, tetapi express saya tidak memiliki folder bin
Qwerty
6

Ini adalah proyek statis server web web server satu file / ringan node.js saya tanpa ketergantungan yang saya percaya adalah alat cepat dan kaya yang penggunaannya semudah mengeluarkan perintah ini pada terminal Linux / Unix / macOS Anda ( atau termux di Android) ketika node.js (atau nodejs-legacydi Debian / Ubuntu) diinstal:

curl pad.js.org | node 

(perintah berbeda ada untuk pengguna Windows pada dokumentasi)

Ini mendukung berbagai hal yang menurut saya bermanfaat,

  • Pembuatan / penyajian indeks direktori hierarki
    • Dengan kemampuan sortir pada kriteria yang berbeda
    • Unggah dari peramban dengan drag-and-drop [multi-file] dan salin-tempel file-saja dan tempel tangkapan layar clipboard sistem dan tempel clipboard pada Chrome, Firefox, dan peramban lain mungkin dengan beberapa batasan (yang dapat dimatikan dengan baris perintah) opsi yang disediakannya)
    • Tombol folder / pembuatan catatan / unggah
  • Melayani MIME yang benar untuk jenis file yang terkenal (dengan kemungkinan untuk menonaktifkannya)
  • Kemungkinan pemasangan sebagai paket npm dan alat lokal atau, instalasi satu-linear sebagai layanan permanen dengan Docker
  • Penyajian file HTTP 206 (transfer file multi-bagian) untuk transfer yang lebih cepat
  • Upload dari terminal dan konsol browser (sebenarnya itu awalnya dimaksudkan untuk menjadi file-system proxy untuk konsol JS browser di halaman / domain lain)
  • Unduhan / unggahan CORS (yang juga dapat dimatikan)
  • Integrasi HTTPS mudah
  • Opsi baris perintah yang ringan untuk mencapai penyajian aman yang lebih baik dengannya:
    • Dengan patch saya di node.js 8 , Anda dapat memiliki akses ke opsi tanpa instalasi pertama:curl pad.js.org | node - -h
    • Atau instal dulu sebagai paket global-sistem npm dengan [sudo] npm install -g pad.jsdan kemudian gunakan versi instalasinya untuk memiliki akses ke opsinya:pad -h
    • Atau gunakan gambar Docker yang disediakan yang menggunakan opsi yang relatif aman secara default. [sudo] docker run --restart=always -v /files:/files --name pad.js -d -p 9090:9090 quay.io/ebraminio/pad.js

Cuplikan layar indeks folder menggunakan alat ini

Fitur-fitur yang dijelaskan di atas sebagian besar didokumentasikan pada halaman utama alat http://pad.js.org yang oleh beberapa trik bagus yang saya gunakan juga merupakan tempat sumber alat itu sendiri juga dilayani dari!

Sumber alat ada di GitHub yang menyambut umpan balik Anda, permintaan fitur dan !s!

Ebrahim Byagowi
sumber
5

Dari [email protected], npmmulai menginstal biner baru di samping npm yang biasa dipanggil npx. Jadi sekarang, satu liner untuk membuat server http statis dari direktori saat ini:

npx serve

atau

npx http-server
DHlavaty
sumber
4

Untuk peningkatan kinerja yang sehat menggunakan node untuk melayani sumber daya statis, saya sarankan menggunakan Buffet . Ia bekerja mirip dengan akselerator aplikasi web yang juga dikenal sebagai caching HTTP reverse proxy tetapi hanya memuat direktori yang dipilih ke dalam memori.

Prasmanan mengambil pendekatan buffer penuh - semua file dimuat penuh ke dalam memori ketika aplikasi Anda boot, sehingga Anda tidak akan pernah merasakan pembakaran sistem file. Dalam praktiknya, ini sangat efisien. Sedemikian rupa sehingga menempatkan Varnish di depan aplikasi Anda bahkan mungkin membuatnya lebih lambat! 

Kami menggunakannya di situs codePile dan menemukan peningkatan ~ 700 permintaan / detik untuk> 4k permintaan / detik pada halaman yang mengunduh 25 sumber daya di bawah 1k beban koneksi pengguna bersamaan.

Contoh:

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');

});

sumber
4

Lihatlah tautan itu .

Anda hanya perlu menginstal modul express dari node js.

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

app.use('/Folder', express.static(__dirname + '/Folder'));

Anda dapat mengakses file Anda seperti http: //hostname/Folder/file.zip

Syed Ali hassan
sumber
4

Di bawah ini bekerja untuk saya:

Buat file app.jsdengan konten di bawah ini:

// 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);

Buat file index.htmldengan konten di bawah ini:

Hi

Mulai baris perintah:

cmd

Jalankan di bawah ini di cmd:

node app.js

Goto di bawah URL, di chrome:

http://localhost:8080/index.html

Itu saja. Semoga itu bisa membantu.

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

Manohar Reddy Poreddy
sumber
3

Anda dapat mencoba melayani saya

Menggunakannya sangat mudah:

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

Itu saja.

PD: Folder yang dilayani secara default adalah "publik".

cocok
sumber
3

Inilah server web sederhana lainnya.

https://www.npmjs.com/package/hostr

Install

npm install -g hostr

Ubah direktur kerja

cd myprojectfolder/

Dan mulai

hostr
Henry Tseng
sumber
Ini juga mengawasi perubahan dan memberikan pemuatan langsung.
Qwerty
3

Dalam node.js polos:

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.')
})

Ini adalah server node.js sederhana yang hanya melayani file yang diminta dalam direktori tertentu.

Pemakaian:

node server.js folder port

foldermungkin absolut atau relatif tergantung pada server.jslokasi. Nilai default .adalah direktori yang Anda jalankan node server.jsperintah.

port secara default adalah 8080 tetapi Anda dapat menentukan port apa saja yang tersedia di OS Anda.

Dalam kasus Anda, saya akan melakukan:

cd D:\Folder
node server.js

Anda dapat menelusuri file di bawah D:\Folderdari browser dengan mengetikhttp://127.0.0.1:8080/somefolder/somefile.html

muratgozel
sumber
2

Itu bukan pada NPM, namun, saya membangun server statis sederhana pada Express yang juga memungkinkan Anda untuk menerima pengiriman formulir dan mengirimkannya melalui layanan email transaksional (Sendgrid untuk saat ini, Mandrill datang).

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

jdr0dn3y
sumber
2

Demi kepentingan para pencari, saya menyukai jawaban Jakub g, tetapi ingin sedikit penanganan kesalahan. Jelas yang terbaik adalah menangani kesalahan dengan benar , tetapi ini akan membantu mencegah situs berhenti jika terjadi kesalahan. Kode di bawah ini:

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
});
Hoki
sumber
Pembaruan - Jawaban saya berfungsi, tetapi sekarang saya menggunakan jawaban @Matt Self menggunakan http-server. Sepertinya ini bekerja dengan baik.
Hoki
2

Pertama instal server simpul-statis via npm install node-static -g -g adalah menginstalnya secara global pada sistem Anda, kemudian navigasikan ke direktori tempat file Anda berada, mulai server dengan static itu mendengarkan pada port 8080, naviaget ke browser dan ketik localhost: 8080 / yourhtmlfilename .

Samba
sumber
2

Anda dapat menggunakan paket servis NPM untuk ini, jika Anda tidak membutuhkan barang NodeJS itu adalah alat yang cepat dan mudah digunakan:

1 - Instal paket pada PC Anda:

npm install -g serve

2 - Sajikan folder statis Anda dengan serve <path>:

d:> serve d:\StaticSite

Ini akan menunjukkan kepada Anda port mana folder statis Anda sedang dilayani, cukup arahkan ke host seperti:

http://localhost:3000
Diego Mendes
sumber
Anda menyadari bahwa itu npmadalah manajer paket simpul sehingga Anda sebenarnya menggunakan barang
NodeJS
Ya, apa yang saya maksud sebagai "NodeJS stuff" menggunakan NodeJS dan mengekspresikan untuk melayani file seperti kebanyakan jawaban yang disarankan. Serve adalah executable independen, NPM digunakan hanya untuk menginstalnya, Anda bisa langsung mengunduhnya.
Diego Mendes
1

Mencari di NPM registry https://npmjs.org/search?q=server , saya telah menemukan static-server https://github.com/maelstrom/static-server

Pernah perlu mengirim kolega file, tetapi tidak dapat diganggu mengirim email binatang 100MB? Ingin menjalankan contoh aplikasi JavaScript sederhana, tetapi memiliki masalah dengan menjalankannya melalui file: /// protokol? Ingin berbagi direktori media Anda di LAN tanpa mengatur Samba, atau FTP, atau hal lain yang mengharuskan Anda mengedit file konfigurasi? Maka file server ini akan membuat hidup Anda sedikit lebih mudah.

Untuk menginstal server barang statis sederhana, gunakan npm:

npm install -g static-server

Kemudian untuk melayani file atau direktori, jalankan saja

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

Itu bahkan dapat membuat daftar isi folder.

Sayangnya, tidak dapat melayani file :)

Paul Verest
sumber
5
Saya membangun server itu. Server file itu dibangun terhadap versi Node yang sangat lama, karenanya mengapa tidak berfungsi lagi. Saya tidak punya waktu sekarang untuk memperbaikinya. Saya sarankan menggunakan jawaban oleh @Oleg di atas. Itu dapat dengan mudah digabung menjadi sebuah simpul kecil yang dapat dieksekusi, dan pada dasarnya adalah apa yang saya lakukan.
Tim Heap
Terima kasih Tim, respons yang sangat profesional. Saya tidak akan menghapus kode, tetapi perbarui readme.
Paul Verest
1

Static-Server sederhana menggunakan koneksi

var connect = require('connect'),
  directory = __dirname,
  port = 3000;

connect()
  .use(connect.logger('dev'))
  .use(connect.static(directory))
  .listen(port);

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

Lihat juga Menggunakan node.js sebagai server web sederhana

dreampulse
sumber
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);

Slava Nazaryan
sumber
Anda harus menambahkan beberapa penjelasan alog dengan kode ini.
Abhinav Gauniyal
1

Jika Anda tertarik pada server http ultra-ringan tanpa prasyarat Anda harus melihat: mongoose

yossico
sumber
0

Anda juga bertanya mengapa permintaan menurun - tidak yakin apa alasan spesifik pada kasus Anda, tetapi secara keseluruhan Anda lebih baik konten statis server menggunakan middleware khusus (nginx, S3, CDN) karena Node benar-benar tidak dioptimalkan untuk pola jaringan ini. Lihat penjelasan lebih lanjut di sini (bullet 13): http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/

Yonatan
sumber