Menggunakan node.js sebagai server web sederhana

1103

Saya ingin menjalankan server HTTP yang sangat sederhana. Setiap permintaan GET example.comharus index.htmldilayani tetapi sebagai halaman HTML biasa (yaitu, pengalaman yang sama seperti ketika Anda membaca halaman web normal).

Dengan menggunakan kode di bawah ini, saya dapat membaca konten index.html. Bagaimana cara saya melayani index.htmlsebagai halaman web biasa?

var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end(index);
}).listen(9615);

Satu saran di bawah ini rumit dan mengharuskan saya untuk menulis getbaris untuk setiap file sumber daya (CSS, JavaScript, gambar) yang ingin saya gunakan.

Bagaimana saya bisa melayani satu halaman HTML dengan beberapa gambar, CSS dan JavaScript?

idophir
sumber
21
Lihatlah modul npm "terhubung". Ini menyediakan fungsionalitas dasar seperti itu dan merupakan dasar dari banyak pengaturan dan paket lainnya.
Mörre
5
Anda harus meletakkan solusi Anda sebagai jawaban dan menandainya dengan benar.
graham.reeds
8
Saya dapat menemukan solusi sempurna oleh Eric B. Sowell yang disebut Melayani file statis dari node js . Baca semuanya. Sangat dianjurkan.
idophir
1
Lihat modul yang saya tulis bernama Cachemere. Itu juga secara otomatis cache semua sumber daya Anda. github.com/topcloud/cachemere
Jon
1
local-web-server adalah contoh yang baik untuk dilihat
Lloyd

Jawaban:

993

Server Node.js yang paling sederhana hanyalah:

$ npm install http-server -g

Sekarang Anda dapat menjalankan server melalui perintah berikut:

$ cd MyApp

$ http-server

Jika Anda menggunakan NPM 5.2.0 atau lebih baru, Anda dapat menggunakannya http-servertanpa menginstalnya npx. Ini tidak disarankan untuk digunakan dalam produksi tetapi merupakan cara yang bagus untuk menjalankan server dengan cepat di localhost.

$ npx http-server

Atau, Anda dapat mencoba ini, yang membuka browser web Anda dan mengaktifkan permintaan CORS:

$ http-server -o --cors

Untuk opsi lainnya, lihat dokumentasi untuk http-serverdi GitHub , atau jalankan:

$ http-server --help

Banyak fitur bagus lainnya dan penyebaran sederhana-mati-otak ke NodeJitsu.

Garpu Fitur

Tentu saja, Anda dapat dengan mudah menambah fitur dengan garpu Anda sendiri. Anda mungkin menemukan itu sudah dilakukan di salah satu dari 800+ garpu proyek ini yang ada:

Server Ringan: Alternatif Penyegaran Otomatis

Alternatif yang bagus http-serveradalah light-server. Ini mendukung menonton file dan menyegarkan otomatis dan banyak fitur lainnya.

$ npm install -g light-server 
$ light-server

Tambahkan ke menu konteks direktori Anda di Windows Explorer

 reg.exe add HKCR\Directory\shell\LightServer\command /ve /t REG_EXPAND_SZ /f /d "\"C:\nodejs\light-server.cmd\" \"-o\" \"-s\" \"%V\""

Server JSON REST sederhana

Jika Anda perlu membuat server REST sederhana untuk proyek prototipe, maka json-server mungkin yang Anda cari.

Editor Penyegaran Otomatis

Sebagian besar editor halaman web dan alat IDE sekarang termasuk server web yang akan menonton file sumber Anda dan secara otomatis me-refresh halaman web Anda ketika mereka berubah.

Saya menggunakan Server Langsung dengan Visual Studio Code.

The open source editor teks Kurung juga termasuk NodeJS web server statis. Cukup buka file HTML apa pun dalam kurung, tekan " Live Preview " dan itu memulai server statis dan membuka browser Anda di halaman. Browser akan ** menyegarkan secara otomatis setiap kali Anda mengedit dan menyimpan file HTML. Ini sangat berguna saat menguji situs web adaptif. Buka halaman HTML Anda di beberapa browser / ukuran / perangkat jendela. Simpan halaman HTML Anda dan langsung lihat apakah hal-hal adaptif Anda berfungsi karena semuanya menyegarkan otomatis.

Pengembang PhoneGap

Jika Anda mengode aplikasi seluler hybrid , Anda mungkin tertarik untuk mengetahui bahwa tim PhoneGap mengambil konsep penyegaran otomatis ini dengan menggunakan Aplikasi PhoneGap baru mereka . Ini adalah aplikasi seluler generik yang dapat memuat file HTML5 dari server selama pengembangan. Ini adalah trik yang sangat licin karena sekarang Anda dapat melewati langkah kompilasi / penyebaran lambat dalam siklus pengembangan Anda untuk aplikasi seluler hybrid jika Anda mengubah file JS / CSS / HTML - yang sering Anda lakukan. Mereka juga menyediakan server web NodeJS statis (jalankan phonegap serve) yang mendeteksi perubahan file.

PhoneGap + Sencha Touch Developers

Saya sekarang telah secara luas mengadaptasi server statis PhoneGap & Aplikasi Pengembang PhoneGap untuk pengembang Sencha Touch & jQuery Mobile. Lihat di Sencha Touch Live . Mendukung --qr QR Codes dan --localtunnel yang proksi server statis Anda dari komputer desktop Anda ke URL di luar firewall Anda! Banyak kegunaan. Speedup besar-besaran untuk pengembang ponsel hybrid.

Pengembang Kerangka Ionik Cordova +

Server lokal dan fitur penyegaran otomatis dimasukkan ke ionicalat. Jalankan saja ionic servedari folder aplikasi Anda. Bahkan lebih baik ... ionic serve --labuntuk melihat tampilan baru secara otomatis dari iOS dan Android.

Tony O'Hagan
sumber
9
npm install live-server -g jika Anda menginginkan hal yang sama, tetapi dengan memuat ulang secara otomatis ketika mendeteksi perubahan file
3
Satu "gotcha" kecil -. http-server default untuk melayani situs di 0.0.0.0. Oleh karena itu, Anda HARUS menentukan alamat IP agar dapat berfungsi dengan baik sebagai penyedia tes lokal:http-server -a localhost
JESii
1
Ya ... 0.0.0.0 akan membuatnya mengikat SEMUA IP dari semua perangkat jaringan IP Anda (WiFi, Kabel, Bluetooth) yang merupakan ide buruk di jaringan publik karena Anda berpotensi diretas. Ini tidak terlalu buruk jika Anda hanya ingin mendemokan aplikasi Anda di dalam jaringan yang aman untuk menunjukkan kepada orang lain atau menghubungkannya ke perangkat seluler Anda di jaringan yang sama.
Tony O'Hagan
Alat kecil yang sangat berguna. Saya memiliki banyak aplikasi Node yang berjalan di server saya, jadi saya menambahkan opsi "-p" untuk memilih port selain 8080. Misalnya: nohup http-server -p 60080 & (mulai di latar belakang dan memungkinkan Anda memutuskan sambungan dari sesi shell.) Anda harus memastikan port terbuka untuk dunia, misalnya: iptables -I INPUT 1 -p tcp --dport 60090 -j ACCEPT (pada banyak sistem Linux)
Blisterpeanuts
Bagaimana menjalankannya sebagai layanan, sehingga saya dapat menggunakannya bahkan dengan menutup command prompt. Apakah ada alat yang menyediakan jenis ini jika tidak ini.
Sandeep sandy
983

Anda dapat menggunakan Connect dan ServeStatic dengan Node.js untuk ini:

  1. Instal connect and serve-static dengan NPM

    $ npm install connect serve-static
  2. Buat file server.js dengan konten ini:

    var connect = require('connect');
    var serveStatic = require('serve-static');
    
    connect()
        .use(serveStatic(__dirname))
        .listen(8080, () => console.log('Server running on 8080...'));
  3. Jalankan dengan Node.js

    $ node server.js

Anda sekarang dapat pergi ke http://localhost:8080/yourfile.html

Gian Marco Gherardi
sumber
24
Idenya adalah untuk tidak menggunakan perpustakaan yang ada, karena alasan pendidikan, tapi saya pikir menggunakan Express adalah saran yang lebih baik daripada versi tingkat rendahnya, Connect.
idophir
135
Bagian dari Express yang melayani file statis hanya Connect, jadi saya tidak melihat alasan untuk menggunakan Express untuk melayani file statis. Tapi ya, Express juga akan melakukan pekerjaan itu.
Gian Marco Gherardi
7
Saran yang sangat baik. Langkah-langkah di atas bekerja dengan baik untuk tujuan saya. Berkat Gian, Ini adalah tautan ke Express yang mengungkapkannya dibuat di Connect, expressjs.com. Berikut ini cara menggunakan Express: expressjs.com/guide.html
Jack Stone
10
Tidak berfungsi untuk saya, hasil Tidak Dapat DAPAT / tes.html. Haruskah saya mengganti __dirname dengan nama direktori?
Timo
3
Sekarang, connect telah berubah ke versi 3. Karena itu, kita harus menggunakan serve-static seperti yang dijelaskan miqid. Saya memposting jawaban lain dengan kode lengkap untuk koneksi v3.
tomet
160

Lihatlah intinya . Saya mereproduksi di sini untuk referensi, tetapi intinya telah diperbarui secara teratur.

Server web file statis Node.JS. Letakkan di jalur Anda untuk menjalankan server di direktori apa pun, mengambil argumen port opsional.

var http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs"),
    port = process.argv[2] || 8888;

http.createServer(function(request, response) {

  var uri = url.parse(request.url).pathname
    , filename = path.join(process.cwd(), uri);

  fs.exists(filename, function(exists) {
    if(!exists) {
      response.writeHead(404, {"Content-Type": "text/plain"});
      response.write("404 Not Found\n");
      response.end();
      return;
    }

    if (fs.statSync(filename).isDirectory()) filename += '/index.html';

    fs.readFile(filename, "binary", function(err, file) {
      if(err) {        
        response.writeHead(500, {"Content-Type": "text/plain"});
        response.write(err + "\n");
        response.end();
        return;
      }

      response.writeHead(200);
      response.write(file, "binary");
      response.end();
    });
  });
}).listen(parseInt(port, 10));

console.log("Static file server running at\n  => http://localhost:" + port + "/\nCTRL + C to shutdown");

Memperbarui

Intinya menangani file css dan js. Saya sudah menggunakannya sendiri. Menggunakan baca / tulis dalam mode "biner" bukan masalah. Itu hanya berarti bahwa file tidak ditafsirkan sebagai teks oleh pustaka file dan tidak terkait dengan tipe konten yang dikembalikan dalam respons.

Masalah dengan kode Anda adalah Anda selalu mengembalikan tipe konten "teks / polos". Kode di atas tidak mengembalikan tipe konten apa pun, tetapi jika Anda hanya menggunakannya untuk HTML, CSS, dan JS, browser dapat menyimpulkannya dengan baik. Tidak ada tipe konten yang lebih baik dari yang salah.

Biasanya tipe konten adalah konfigurasi server web Anda. Jadi saya minta maaf jika ini tidak menyelesaikan masalah Anda , tetapi itu bekerja untuk saya sebagai server pengembangan sederhana dan berpikir itu mungkin membantu beberapa orang lain. Jika Anda benar-benar perlu tipe konten dalam respons, Anda harus mendefinisikannya secara eksplisit sebagai joeytwiddle memiliki atau menggunakan perpustakaan seperti Connect yang memiliki default yang masuk akal. Yang menyenangkan tentang ini adalah bahwa itu sederhana dan mandiri (tidak ada ketergantungan).

Tapi saya merasakan masalah Anda. Jadi di sini adalah solusi gabungan.

var http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs")
    port = process.argv[2] || 8888;

http.createServer(function(request, response) {

  var uri = url.parse(request.url).pathname
    , filename = path.join(process.cwd(), uri);

  var contentTypesByExtension = {
    '.html': "text/html",
    '.css':  "text/css",
    '.js':   "text/javascript"
  };

  fs.exists(filename, function(exists) {
    if(!exists) {
      response.writeHead(404, {"Content-Type": "text/plain"});
      response.write("404 Not Found\n");
      response.end();
      return;
    }

    if (fs.statSync(filename).isDirectory()) filename += '/index.html';

    fs.readFile(filename, "binary", function(err, file) {
      if(err) {        
        response.writeHead(500, {"Content-Type": "text/plain"});
        response.write(err + "\n");
        response.end();
        return;
      }

      var headers = {};
      var contentType = contentTypesByExtension[path.extname(filename)];
      if (contentType) headers["Content-Type"] = contentType;
      response.writeHead(200, headers);
      response.write(file, "binary");
      response.end();
    });
  });
}).listen(parseInt(port, 10));

console.log("Static file server running at\n  => http://localhost:" + port + "/\nCTRL + C to shutdown");
Jonathan Tran
sumber
3
Ini tidak benar-benar menyelesaikan "masalah". Anda mengembalikan index.html sebagai file biner dan Anda tidak menangani css dan js.
idophir
4
Itu menangani css dan js. Itu tidak mengembalikan index.html sebagai file biner. Itu hanya menyalin data dari disk dalam format apa pun itu. Silakan lihat pembaruan untuk penjelasan lebih lanjut.
Jonathan Tran
satu masalah dengan kode, ini case-sensitive, pada unix untuk file-file tertentu, ia memberikan 404
Pradeep
2
Perhatikan bahwa "path.exists dan path.existsSync sekarang sudah usang. Silakan gunakan fs.exists dan fs.existsSync." stackoverflow.com/a/5008295/259
David Sykes
3
Catatan yang fs.exists()sudah usang sekarang. Tangkap kesalahan pada fs.stat()daripada menciptakan kondisi balapan.
Matt
100

Anda tidak perlu mengungkapkan. Anda tidak perlu terhubung. Node.js tidak http NATIVELY. Yang perlu Anda lakukan adalah mengembalikan file yang tergantung pada permintaan:

var http = require('http')
var url = require('url')
var fs = require('fs')

http.createServer(function (request, response) {
    var requestUrl = url.parse(request.url)    
    response.writeHead(200)
    fs.createReadStream(requestUrl.pathname).pipe(response)  // do NOT use fs's sync methods ANYWHERE on production (e.g readFileSync) 
}).listen(9615)    

Contoh yang lebih lengkap yang memastikan permintaan tidak dapat mengakses file di bawah direktori-dasar, dan melakukan penanganan kesalahan yang tepat:

var http = require('http')
var url = require('url')
var fs = require('fs')
var path = require('path')
var baseDirectory = __dirname   // or whatever base directory you want

var port = 9615

http.createServer(function (request, response) {
    try {
        var requestUrl = url.parse(request.url)

        // need to use path.normalize so people can't access directories underneath baseDirectory
        var fsPath = baseDirectory+path.normalize(requestUrl.pathname)

        var fileStream = fs.createReadStream(fsPath)
        fileStream.pipe(response)
        fileStream.on('open', function() {
             response.writeHead(200)
        })
        fileStream.on('error',function(e) {
             response.writeHead(404)     // assume the file doesn't exist
             response.end()
        })
   } catch(e) {
        response.writeHead(500)
        response.end()     // end the response so browsers don't hang
        console.log(e.stack)
   }
}).listen(port)

console.log("listening on port "+port)
BT
sumber
3
Jika saya tidak salah solusi ini tidak menangani jenis pengkodean sehingga permintaan untuk halaman HTML dan gambar akan mendapatkan pengkodean yang sama. Bukan?
idophir
2
@idophir Seringkali pengkodean tidak masalah, browser menyimpulkannya berdasarkan tag html yang digunakan, atau informasi lainnya, atau mereka menebak dengan sangat baik. Seperti seseorang yang disebutkan di atas, tidak ada tipe MIME yang lebih baik daripada yang salah. Anda tentu saja dapat menggunakan sesuatu seperti node-mime untuk mengetahui tipe-tipe file mime, tetapi server http yang sepenuhnya sesuai dengan web tidak termasuk dalam cakupan untuk pertanyaan ini.
BT
1
@Rooster Anda seharusnya tidak perlu sesuatu yang istimewa - cukup node thisfile.js. Itu akan berjalan, mendengarkan koneksi baru dan mengembalikan hasil baru, sampai A. itu ditutup oleh sinyal, atau B. beberapa kesalahan gila entah bagaimana menyebabkan penghentian program.
BT
1
@Rooster Daemonizer lain dari beberapa reputasi ditemukan di github.com/Unitech/pm2
Travelling Man
1
Saya suka jawaban ini yang terbaik, tetapi ada dua masalah: 1) Mengembalikan 200 ketika seharusnya mengembalikan 404; untuk memperbaikinya saya memanggil writeHead (200) di dalam callback 'terbuka'. 2) Jika ada kesalahan, soket dibiarkan terbuka; untuk memperbaiki saya panggil response.destroy () di dalam panggilan balik 'kesalahan'.
Paul Brannan
70

Saya pikir bagian yang Anda lewatkan saat ini adalah yang Anda kirim:

Content-Type: text/plain

Jika Anda ingin peramban web merender HTML, Anda harus mengubahnya ke:

Content-Type: text/html
clee
sumber
Terima kasih atas balasan cepatnya. Halaman sekarang dimuat tetapi tanpa CSS. Bagaimana saya bisa mendapatkan halaman html standar dengan CSS dan JS dimuat?
idophir
20
Anda harus mulai memperluas server itu. Saat ini hanya tahu cara menayangkan index.html - Anda perlu mengajari cara melayani foo.css dan foo.js sekarang, dengan jenis MIME yang sesuai.
clee
1
Jika Anda tidak ingin menayangkan file statis, Anda dapat memasukkan css ke dalam <style>tag.
Keith
1
Setelah sembilan tahun, ini benar-benar harus diterima sebagai jawaban yang benar.
rooch84
46

Step1 (command prompt di dalam [Saya harap Anda cd KE FOLDER ANDA]): npm install express

Langkah 2: Buat file server.js

var fs = require("fs");
var host = "127.0.0.1";
var port = 1337;
var express = require("express");

var app = express();
app.use(express.static(__dirname + "/public")); //use static files in ROOT/public folder

app.get("/", function(request, response){ //root dir
    response.send("Hello!!");
});

app.listen(port, host);

Harap dicatat, Anda harus menambahkan WATCHFILE (atau menggunakan nodemon) juga. Kode di atas hanya untuk server koneksi sederhana.

LANGKAH 3: node server.jsataunodemon server.js

Sekarang ada metode yang lebih mudah jika Anda hanya ingin meng-host server HTTP sederhana. npm install -g http-server

dan buka direktori dan jenis kami http-server

https://www.npmjs.org/package/http-server

BAJA
sumber
@ STEEL, apakah ada cara untuk memulai server node secara otomatis. Maksud saya tanpa pergi ke jalur direktori dan kemudian ketik nodeserver maka hanya akan dimulai. saya ingin memulai server simpul seperti IIS. dapatkah Anda memberi tahu saya
Vinoth
@ Vinoth ya ada banyak cara. Apa tujuan atau target Anda, saya dapat membantu Anda
STEEL
@steel saya ingin memulai server secara otomatis tanpa memberikan node server dalam perintah promt. ini persyaratan saya, mungkinkah Anda memberi tahu saya beberapa contoh
Vinoth
Anda perlu menggunakan beberapa alat seperti ThoughtWorks GO, yang dapat menjalankan perintah Terminal dari satu klik dari peramban.
STEEL
32

Cara cepat:

var express = require('express');
var app = express();
app.use('/', express.static(__dirname + '/../public')); // ← adjust
app.listen(3000, function() { console.log('listening'); });

Jalanmu:

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

http.createServer(function (req, res) {
    console.dir(req.url);

    // will get you  '/' or 'index.html' or 'css/styles.css' ...
    // • you need to isolate extension
    // • have a small mimetype lookup array/object
    // • only there and then reading the file
    // •  delivering it after setting the right content type

    res.writeHead(200, {'Content-Type': 'text/html'});

    res.end('ok');
}).listen(3001);
Frank Nocke
sumber
19

Daripada berurusan dengan pernyataan switch, saya pikir lebih baik untuk mencari jenis konten dari kamus:

var contentTypesByExtension = {
    'html': "text/html",
    'js':   "text/javascript"
};

...

    var contentType = contentTypesByExtension[fileExtension] || 'text/plain';
joeytwiddle
sumber
Ya, terlihat jauh lebih elegan daripada solusi "switch" yang digunakan oleh Eric B. Sowell (lihat jawaban yang dipilih). Terima kasih.
idophir
Jawaban ini benar-benar di luar konteks ... Ini merujuk pada tautan ini dalam komentar ini - stackoverflow.com/questions/6084360/… (yeah, apa pun, internet rusak)
Mars Robertson
15

Ini pada dasarnya adalah versi terbaru dari jawaban yang diterima untuk koneksi versi 3:

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

var app = connect();

app.use(serveStatic(__dirname, {'index': ['index.html']}));
app.listen(3000);

Saya juga menambahkan opsi default sehingga index.html disajikan sebagai default.

tomet
sumber
13

Anda tidak perlu menggunakan modul NPM apa pun untuk menjalankan server sederhana, ada perpustakaan yang sangat kecil yang disebut " NPM Free Server " untuk Node:

50 baris kode, keluaran jika Anda meminta file atau folder dan memberikannya warna merah atau hijau jika gagal untuk bekerja. Ukurannya kurang dari 1KB (diperkecil).

Jaredcheeda
sumber
Pilihan luar biasa. Melayani html, css, js, dan gambar. Bagus untuk debugging. Ganti saja kode ini dengan server.js Anda.
pollaris
2
Saya berharap saya dapat menambahkan lebih banyak upvotes! Ini bagus! Saya membuat perubahan kecil var filename = path.join(process.cwd() + '/dist/', uri); ke server dari folder dist . Saya memasukkan kode server.jsdan hanya berfungsi ketika saya mengetiknpm start
John Henckel
Bagaimana menjalankannya sebagai layanan, sehingga saya dapat menggunakannya bahkan dengan menutup command prompt. Apakah ada alat yang menyediakan jenis ini jika tidak ini.
Sandeep sandy
13

jika Anda memiliki simpul yang diinstal pada PC Anda, mungkin Anda memiliki NPM, jika Anda tidak memerlukan hal-hal NodeJS, Anda dapat menggunakan paket servis untuk ini:

1 - Instal paket pada PC Anda:

npm install -g serve

2 - Sajikan folder statis Anda:

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
Bagaimana menjalankannya sebagai layanan, sehingga saya dapat menggunakannya bahkan dengan menutup command prompt. Apakah ada alat yang menyediakan jenis ini jika tidak ini.
Sandeep sandy
Ini harus menjadi jawaban yang diterima. Karena ini yang paling mudah, dan bekerja di luar kotak. Jadi jika Anda menjalankan hanya melayani tanpa path, itu akan menjalankan server dari folder saat ini (yang mana Anda memiliki CD-ed sebelumnya).
Игор Рајачић
9

Saya menemukan perpustakaan yang menarik di npm yang mungkin berguna bagi Anda. Ini disebut mime ( npm install mimeatau https://github.com/broofa/node-mime ) dan dapat menentukan tipe mime dari suatu file. Berikut adalah contoh server web yang saya tulis menggunakannya:

var mime = require("mime"),http = require("http"),fs = require("fs");
http.createServer(function (req, resp) {
path  = unescape(__dirname + req.url)
var code = 200
 if(fs.existsSync(path)) {
    if(fs.lstatSync(path).isDirectory()) {
        if(fs.existsSync(path+"index.html")) {
        path += "index.html"
        } else {
            code = 403
            resp.writeHead(code, {"Content-Type": "text/plain"});
            resp.end(code+" "+http.STATUS_CODES[code]+" "+req.url);
        }
    }
    resp.writeHead(code, {"Content-Type": mime.lookup(path)})
    fs.readFile(path, function (e, r) {
    resp.end(r);

})
} else {
    code = 404
    resp.writeHead(code, {"Content-Type":"text/plain"});
    resp.end(code+" "+http.STATUS_CODES[code]+" "+req.url);
}
console.log("GET "+code+" "+http.STATUS_CODES[code]+" "+req.url)
}).listen(9000,"localhost");
console.log("Listening at http://localhost:9000")

Ini akan menayangkan file teks atau gambar biasa (.html, .css, .js, .pdf, .jpg, .png, .m4a dan .mp3 adalah ekstensi yang telah saya uji, tetapi menurut teori itu harus berfungsi untuk semuanya)

Catatan Pengembang

Ini adalah contoh dari output yang saya dapatkan:

Listening at http://localhost:9000
GET 200 OK /cloud
GET 404 Not Found /cloud/favicon.ico
GET 200 OK /cloud/icon.png
GET 200 OK /
GET 200 OK /501.png
GET 200 OK /cloud/manifest.json
GET 200 OK /config.log
GET 200 OK /export1.png
GET 200 OK /Chrome3DGlasses.pdf
GET 200 OK /cloud
GET 200 OK /-1
GET 200 OK /Delta-Vs_for_inner_Solar_System.svg

Perhatikan unescapefungsi dalam pembangunan jalur. Ini untuk memungkinkan nama file dengan spasi dan karakter yang disandikan.

MayorMonty
sumber
8

Edit:

Aplikasi sampel Node.js. Node Chat memiliki fungsi yang Anda inginkan.
Di dalamnya README.textfile
3. Langkah adalah apa yang Anda cari.

Langkah 1

  • buat server yang merespons dengan hello world di port 8002

Langkah 2

  • buat index.html dan sajikan

langkah3

  • perkenalkan util.js
  • ubah logika sehingga semua file statis dilayani
  • tampilkan 404 jika tidak ada file yang ditemukan

step4

  • tambahkan jquery-1.4.2.js
  • tambahkan client.js
  • ubah index.html untuk meminta pengguna nama panggilan

Berikut ini adalah server.js

Inilah util.js

Kerem Baydoğan
sumber
5
Saya tidak peduli. Saya hanya punya index.html. Saya hanya ingin mendapatkan html + css + js dimuat. Terima kasih!
idophir
16
-1 untuk .readFileSyncdalam panggilan balik. Dengan node.js kita menggunakan IO non blocking. Tolong jangan rekomendasikan Syncperintah.
Raynos
Hai @rmby, terima kasih telah mencoba membantu. Saya benar-benar baru dalam hal ini. Saya mengunduh server.js dan util.js. Ketika saya menjalankan "node server.js" dan mencoba mengakses halaman menggunakan browser, saya mendapatkan kesalahan ini: TypeError: Object # <ServerResponse> tidak memiliki metode 'tutup' di /var/www/hppy-site/util.js : 67: 8 di /var/www/hppy-site/util.js:56:4 di [object Object]. <anonymous> (fs.js: 107: 5) di [object Object] .emit (events.js : 61: 17) at afterRead (fs.js: 970: 12) at wrapper (fs.js: 245: 17) Ada ide? BTW - hal yang sama terjadi ketika saya mengunduh proyek Anda dan menjalankannya.
idophir
1
Maaf. Saya menggunakan versi baru. Diganti res.close () dengan res.end ()
idophir
8

Cara saya melakukannya adalah dengan pertama-tama menginstal server statis node secara global

npm install node-static -g

lalu arahkan ke direktori yang berisi file html Anda dan mulai dengan server statis static .

Buka browser dan ketik localhost:8080/"yourHtmlFile".

Samba
sumber
1
Tidak ada yang mengalahkan satu garis. Terima kasih!
AndroidDev
Bagaimana menjalankannya sebagai layanan, sehingga saya dapat menggunakannya bahkan dengan menutup command prompt. Apakah ada alat yang menyediakan jenis ini jika tidak ini.
Sandeep sandy
7
var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    // change the to 'text/plain' to 'text/html' it will work as your index page
    res.end(index);
}).listen(9615);

Saya pikir Anda di mana mencari ini. Di index.html Anda, cukup isi dengan kode html normal - apa pun yang ingin Anda render di atasnya, seperti:

<html>
    <h1>Hello world</h1>
</html>
Ashish Ranjan
sumber
7

Pada dasarnya menyalin jawaban yang diterima, tetapi menghindari membuat file js.

$ node
> var connect = require('connect'); connect().use(static('.')).listen(8000);

Menemukannya sangat convinient.

Memperbarui

Pada versi terbaru Express, serve-static telah menjadi middleware terpisah. Gunakan ini untuk melayani:

require('http').createServer(require('serve-static')('.')).listen(3000)

Instal serve-staticdulu.

Xiao Peng - ZenUML.com
sumber
6

dari w3schools

sangat mudah untuk membuat server simpul untuk melayani file apa pun yang diminta, dan Anda tidak perlu menginstal paket apa pun untuk itu

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

http.createServer(function (req, res) {
  var q = url.parse(req.url, true);
  var filename = "." + q.pathname;
  fs.readFile(filename, function(err, data) {
    if (err) {
      res.writeHead(404, {'Content-Type': 'text/html'});
      return res.end("404 Not Found");
    }  
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    return res.end();
  });
}).listen(8080);

http: // localhost: 8080 / file.html

akan melayani file.html dari disk

Ahmed M. Matar
sumber
5

Saya menggunakan kode di bawah ini untuk memulai server web sederhana yang membuat file html default jika tidak ada file yang disebutkan dalam Url.

var http = require('http'),
fs = require('fs'),
url = require('url'),
rootFolder = '/views/',
defaultFileName = '/views/5 Tips on improving Programming Logic   Geek Files.htm';


http.createServer(function(req, res){

    var fileName = url.parse(req.url).pathname;
    // If no file name in Url, use default file name
    fileName = (fileName == "/") ? defaultFileName : rootFolder + fileName;

    fs.readFile(__dirname + decodeURIComponent(fileName), 'binary',function(err, content){
        if (content != null && content != '' ){
            res.writeHead(200,{'Content-Length':content.length});
            res.write(content);
        }
        res.end();
    });

}).listen(8800);

Ini akan membuat semua file js, css dan gambar, bersama dengan semua konten html.

Setuju pada pernyataan " Tidak ada tipe konten yang lebih baik daripada yang salah "

Sachin303
sumber
5

Saya tidak yakin apakah ini yang Anda inginkan, namun, Anda dapat mencoba mengubah:

{'Content-Type': 'text/plain'}

untuk ini:

{'Content-Type': 'text/html'}

Ini akan membuat klien browser menampilkan file sebagai html bukan teks biasa.

Xenry
sumber
1
Bukankah ini sama dengan jawaban yang ada ini ?
Pang
4
var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');

http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'html'});
res.end(index);
}).listen(9615);

//Just Change The CONTENT TYPE to 'html'
pengguna3389163
sumber
6
The Content-Typeharus text/html, seperti yang didefinisikan dengan cara itu: Content-Type := type "/" subtype *[";" parameter].
t.niese
1
ini tampaknya mengubah semua file saya di folder itu menjadi tipe html, bahkan jika itu js ...
ahnbizcad
Bekerja hebat ....
smack cherry
4

Versi 4.x verbose express yang sedikit lebih banyak tetapi menyediakan daftar direktori, kompresi, caching dan permintaan masuk dalam jumlah minimal baris

var express = require('express');
var compress = require('compression');
var directory = require('serve-index');
var morgan = require('morgan'); //logging for express

var app = express();

var oneDay = 86400000;

app.use(compress());
app.use(morgan());
app.use(express.static('filesdir', { maxAge: oneDay }));
app.use(directory('filesdir', {'icons': true}))

app.listen(process.env.PORT || 8000);

console.log("Ready To serve files !")
Bruno Grieder
sumber
4

Jumlah jawaban rumit yang gila di sini. Jika Anda tidak bermaksud memproses file / basis data nodeJS tetapi hanya ingin menyajikan html / css / js / gambar statis seperti yang disarankan pertanyaan Anda, cukup instal pushstate-server modul atau yang serupa;

Inilah "satu liner" yang akan membuat dan meluncurkan situs mini. Cukup tempelkan seluruh blok di terminal Anda di direktori yang sesuai.

mkdir mysite; \
cd mysite; \
npm install pushstate-server --save; \
mkdir app; \
touch app/index.html; \
echo '<h1>Hello World</h1>' > app/index.html; \
touch server.js; \
echo "var server = require('pushstate-server');server.start({ port: 3000, directory: './app' });" > server.js; \
node server.js

Buka browser dan buka http: // localhost: 3000 . Selesai

Server akan menggunakan appdir sebagai root untuk melayani file dari. Untuk menambahkan aset tambahan cukup tempatkan mereka di dalam direktori itu.

cyberwombat
sumber
2
Jika Anda sudah memiliki statika, Anda dapat menggunakan yang berikut ini:npm install pushstate-server --save; touch server.js; echo "var server = require('pushstate-server');server.start({ port: 3000, directory: './' });" > server.js; node server.js
Putar
4

Sudah ada beberapa solusi hebat untuk yang sederhana nodejs server. Ada satu solusi lagi jika Anda perlu live-reloadingsaat Anda membuat perubahan pada file Anda.

npm install lite-server -g

arahkan direktori Anda dan lakukan

lite-server

itu akan membuka browser untuk Anda dengan live-reload.

lokeshjain2008
sumber
4

Fungsi Express sendFile melakukan apa yang Anda butuhkan, dan karena Anda menginginkan fungsionalitas server web dari node, express menjadi pilihan alami dan kemudian menyajikan file statis menjadi semudah:

res.sendFile('/path_to_your/index.html')

baca lebih lanjut di sini: https://expressjs.com/en/api.html#res.sendFile

Contoh kecil dengan server web ekspres untuk simpul:

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

app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname + '/index.html'));
});

app.listen(8080);

jalankan ini, dan arahkan ke http: // localhost: 8080

Untuk memperluas ini agar Anda dapat melayani file statis seperti css dan gambar, berikut adalah contoh lain:

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

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

app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname + '/index.html'));
});

app.listen(8080);

jadi buat subfolder bernama css, masukkan konten statis Anda di dalamnya, dan itu akan tersedia untuk index.html Anda untuk referensi mudah seperti:

<link type="text/css" rel="stylesheet" href="/css/style.css" />

Perhatikan jalur relatif di href!

voila!

Mladen Oršolić
sumber
3

Sebagian besar jawaban di atas menggambarkan dengan sangat baik bagaimana konten disajikan. Apa yang saya cari sebagai tambahan adalah daftar direktori sehingga isi direktori lain dapat diramban. Inilah solusi saya untuk pembaca lebih lanjut:

'use strict';

var finalhandler = require('finalhandler');
var http = require('http');
var serveIndex = require('serve-index');
var serveStatic = require('serve-static');
var appRootDir = require('app-root-dir').get();
var log = require(appRootDir + '/log/bunyan.js');

var PORT = process.env.port || 8097;

// Serve directory indexes for reports folder (with icons)
var index = serveIndex('reports/', {'icons': true});

// Serve up files under the folder
var serve = serveStatic('reports/');

// Create server
var server = http.createServer(function onRequest(req, res){
    var done = finalhandler(req, res);
    serve(req, res, function onNext(err) {
    if (err)
        return done(err);
    index(req, res, done);
    })
});


server.listen(PORT, log.info('Server listening on: ', PORT));
Abu Shumon
sumber
2

Ini adalah salah satu solusi tercepat yang saya gunakan untuk melihat halaman web dengan cepat

sudo npm install ripple-emulator -g

Mulai saat itu cukup masukkan direktori file html Anda dan jalankan

ripple emulate

kemudian ubah perangkat ke lansekap Nexus 7.

Helzgate
sumber
5
Apa yang harus dilakukan Nexus 7 dengan ini?
waeltken
2

Versi sederhana yang saya temui adalah sebagai berikut. Untuk tujuan pendidikan, yang terbaik, karena tidak menggunakan perpustakaan abstrak.

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

var mimeTypes = {
  "html": "text/html",
  "mp3":"audio/mpeg",
  "mp4":"video/mp4",
  "jpeg": "image/jpeg",
  "jpg": "image/jpeg",
  "png": "image/png",
  "js": "text/javascript",
  "css": "text/css"};

http.createServer(function(req, res) {
    var uri = url.parse(req.url).pathname;
    var filename = path.join(process.cwd(), uri);
    fs.exists(filename, function(exists) {
        if(!exists) {
            console.log("not exists: " + filename);
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.write('404 Not Found\n');
            res.end();
            return;
        }
        var mimeType = mimeTypes[path.extname(filename).split(".")[1]];
        res.writeHead(200, {'Content-Type':mimeType});

        var fileStream = fs.createReadStream(filename);
        fileStream.pipe(res);

    }); //end path.exists
}).listen(1337);

Sekarang buka browser dan buka berikut ini:

http://127.0.0.1/image.jpg

Di sini image.jpgharus dalam direktori yang sama dengan file ini. Semoga ini bisa membantu seseorang :)

Kaushal28
sumber
Anda seharusnya tidak menganggap tipe-pantomim dari nama file.
mwieczorek
Catatan: fs.exists () telah ditinggalkan, fs.existsSync () adalah pengganti langsung.
JWAspin
@ mwieczorek bagaimana seharusnya ramalan? Apakah Anda melewatkan bahwa dia memisahkan ekstensi file?
James Newton
Mungkin ingin menggunakan: let mimeType = mimeTypes [filename.split ("."). Pop ()] || "application / octet-stream"
James Newton
1

Saya juga dapat merekomendasikan SugoiJS, sangat mudah untuk mengatur dan memberikan opsi untuk mulai menulis cepat dan memiliki fitur-fitur hebat.

Lihatlah di sini untuk memulai: http://demo.sugoijs.com/ , dokumentasi: https://wiki.sugoijs.com/

Ini memiliki permintaan menangani dekorator, kebijakan permintaan dan dekorator kebijakan otorisasi.

Sebagai contoh:

import {Controller,Response,HttpGet,RequestParam} from "@sugoi/server";

@Controller('/dashboard')
export class CoreController{
    constructor(){}

    @HttpGet("/:role")
    test(@RequestParam('role') role:string,
         @RequestHeader("role") headerRole:string){
        if(role === headerRole )
            return "authorized";
        else{
            throw new Error("unauthorized")
        }
    }
}
Gen4ik
sumber
1

Sangat mudah dengan banyak perpustakaan yang hadir hari ini. Jawaban di sini fungsional. Jika Anda ingin versi lain untuk memulai lebih cepat dan sederhana

Tentu saja instal node.js. Kemudian:

> # module with zero dependencies
> npm install -g @kawix/core@latest 
> # change /path/to/static with your folder or empty for current
> kwcore "https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express-static.js" /path/to/static

Di sini isi " https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express-static.js " (Anda tidak perlu mengunduhnya, saya diposting untuk memahami cara kerjanya)

// you can use like this:
// kwcore "https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express.js" /path/to/static
// kwcore "https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express.js" 

// this will download the npm module and make a local cache
import express from 'npm://express@^4.16.4'
import Path from 'path'

var folder= process.argv[2] || "."
folder= Path.resolve(process.cwd(), folder)
console.log("Using folder as public: " + folder)

var app = express() 
app.use(express.static(folder)) 
app.listen(8181)
console.log("Listening on 8181")
James Suárez
sumber