Máy chủ tệp nhanh Node.js (tệp tĩnh qua HTTP)


642

Có công cụ sẵn sàng sử dụng Node.js (được cài đặt npm) không, điều đó sẽ giúp tôi hiển thị nội dung thư mục dưới dạng máy chủ tệp qua HTTP.

Ví dụ, nếu tôi có

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

Sau đó bắt đầu trong D:\Folder\ node node-file-server.js tôi có thể truy cập tập tin qua

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

Tại sao nút máy chủ tệp tĩnh của tôi yêu cầu thả? tham khảo một số bí ẩn

máy chủ tệp tĩnh node.js tiêu chuẩn

Nếu không có công cụ như vậy, tôi nên sử dụng khuôn khổ nào?

Liên quan: Máy chủ tệp tĩnh cơ bản trong NodeJS


Tôi đã viết một mô-đun gọi là Cachemere cho phép bạn làm điều này. Nó cũng tự động lưu trữ tất cả các tài nguyên của bạn. Hãy xem thử: github.com/topcloud/cachemere
Jon

npmjs.com/package/local-web-server - máy chủ web tĩnh nhẹ, cấu hình không
Victor

Câu trả lời:


1090

Tùy chọn "công cụ sẵn sàng sử dụng" tốt có thể là máy chủ http:

npm install http-server -g

Để dùng nó:

cd D:\Folder
http-server

Hoặc, như thế này:

http-server D:\Folder

Hãy xem thử: https://github.com/nod Ứng dụng / http : server


10
Điều này thật tuyệt. Tôi cần chỉ định một địa chỉ bc vì một số lý do mặc định 0.0.0.0 không hợp tác với môi trường dev của tôi. http-server -a localhostđã er dun.
Sam Berry

41
tôi sử dụnghttp-server -a localhost -p 80
Muhammad Umer

10
Cũng đáng kiểm tra đồng bộ hóa trình duyệt , có thể thực hiện ít nhiều điều tương tự nhưng với phần thưởng bổ sung là cập nhật trực tiếp khi các tệp được sửa đổi.
Nick F

3
--corsđể gửi Access-Control-Allow-Origin:*cùng với các tiêu đề phản hồi (tức là khi phục vụ tệp json)
Daniel F

9
npx http-server- npx biến nó thành một lớp lót tải xuống các tệp cần thiết và chạy nó.
Mike McKay

186

Nếu bạn không muốn sử dụng công cụ sẵn sàng, bạn có thể sử dụng mã bên dưới, như được trình bày bởi tôi tại 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/');

CẬP NHẬT Nếu bạn cần truy cập máy chủ của mình từ tệp / nhu cầu bên ngoài, bạn cần khắc phục CORS, trong tệp node.js của mình bằng cách viết dưới đây, như tôi đã đề cập trong câu trả lời trước đây tại đây

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

CẬP NHẬT

Như Adrian đã đề cập, trong các bình luận, anh ấy đã viết mã ES6 với lời giải thích đầy đủ ở đây , tôi chỉ đăng lại mã của mình bên dưới, trong trường hợp mã đi từ trang web gốc vì bất kỳ lý do nào:

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
Chắc chắn response.writeHead(200là vậy response.writeHead(404;)
Thomas Hunter II

14
Mã đó sẽ không cho phép đi lên cây tệp bằng cách thực hiện một cái gì đó như 127.0.0.1/../../../etc/passwd ? Tôi thấy không có kiểm tra chống lại điều đó.
Rolf

3
Nếu bất cứ ai quan tâm đến phiên bản ES6 +, tôi đã tạo một máy chủ tệp tĩnh xử lý các loại MIME: gist.github.com/amejiarosario/53afae82e18db30dadc9bc39035778e5
Adrian

1
@Adrian Mã này rất tuyệt vời, nhưng tôi đã tìm ra cách để có quyền truy cập root với nó. Giải pháp là giới hạn số lượng thời gian hàng đầu trên tên tệp thành một để bạn không thể thực hiện ../../etc/passwordcông cụ. gist.github.com/amejiarosario/53afae82e18db30dadc9bc39035778e5
Seph Reed

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

79

Đối với những người muốn một máy chủ có thể chạy được trong tập lệnh NodeJS:

Bạn có thể sử dụng expressjs / phục vụ tĩnh thay thế connect.static(không còn khả dụng kể từ kết nối 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);

và sau đó từ dòng lệnh:

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

1
FYI Điều này đã không làm việc cho tôi. Tôi đã cài đặt filehandler bằng cách sử dụng npm install filehandlervà gói được liệt kê trong node_modulesthư mục. Nhưng khi tôi chạy myapp.jsnút ném một lỗi, nói Error: cannot find module filehandler. Nếu tôi nhận xét yêu cầu ststment để tải file handler thì ứng dụng tải chỉ phục vụ tĩnh, vì vậy có vẻ như có gì đó không ổn với gói filhandler. Hôm nay là ngày 12 tháng 12 năm 2014, vì vậy có lẽ gói đã thay đổi kể từ khi câu trả lời này được đăng?
Lee Jenkins

7
Đó là finalxử lý khôngfile
jakub.g 12/12/14

một ưu điểm khác của giải pháp này là, các tệp không được lưu trong bộ nhớ cache, vì vậy bạn không cần phải khởi động lại một quy trình khi thực hiện thay đổi mã.
klimat

59

Tôi biết đó không phải là Node, nhưng tôi đã sử dụng SimpleHTTPServer của Python:

python -m SimpleHTTPServer [port]

Nó hoạt động tốt và đi kèm với Python.


16
Tương đương Python3: python -m http.server [port](cái được đề cập là dành cho Python2)
jakub.g 19/03/2015

Python thất bại đối với tôi khi nói về việc phục vụ các tệp lớn như hình ảnh hệ điều hành. Fedora 23
Zimy

9
Và trên PHP:php -S localhost:8000
dennis

Tôi sử dụng điều này để nhanh chóng phục vụ nội dung từ một thư mục mọi lúc.
Adrian Lynch

33

kết nối có thể là những gì bạn đang tìm kiếm.

Cài đặt dễ dàng với:

npm install connect

Sau đó, máy chủ tệp tĩnh cơ bản nhất có thể được viết là:

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

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

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

4
Điều này không hoạt động nữa kể từ kết nối 3 vì nó không lộ ra connect.static; xem câu trả lời của tôi dưới đây để thay thế
jakub.g

4
Tôi tin rằng nó vẫn được đóng gói với express theo mặc định, nhưng thực sự tồn tại trong một requiremô-đun có khả năng riêng biệt "phục vụ tĩnh".
Oleg

18

Cài đặt nhanh bằng npm: https://expressjs.com/en/starter/installing.html

Tạo một tệp có tên server.js ở cùng cấp index.html của bạn với nội dung này:

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

Nếu bạn muốn đặt nó ở một vị trí khác, hãy đặt đường dẫn trên dòng thứ ba:

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

CD vào thư mục chứa tệp của bạn và chạy nút từ bàn điều khiển bằng lệnh này:

node server.js

Duyệt đến localhost: 8080


1
Xin chào, tôi có thể chạy nó một cách chính xác, nhưng nó cho thấy Cannot GET /. Tôi sử dụng AWS EC2 để chạy máy chủ.
Wei Xia

1
@Wei Hi, trả lời muộn. Từ những gì tôi có thể thấy từ một tìm kiếm nhanh trên Google, có vẻ như cấu trúc thư mục của bạn có thể sai. Phải có tệp index.html ở vị trí bạn đang nhắm mục tiêu. Thiết lập ví dụ trên để chạy sẽ mất 5 phút và tôi đã kiểm tra lại xem nó có hoạt động như cũ không. Từ đó bạn có thể điều chỉnh đường dẫn cho phù hợp với cấu trúc thư mục của mình và kiểm tra xem máy chủ có còn tìm thấy các tệp mà nó cần đến máy chủ không.
pasx

path.join(__dirname, 'public')là nhiều nền tảng hơn.
sdgfsdh

17

Bằng chứng một dòng ™ thay vì lời hứa

nhập mô tả hình ảnh ở đây

Đầu tiên là http-server, hs- liên kết

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

Thứ hai là servebởi ZEIT.co - link

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

Sau đây là các tùy chọn có sẵn, nếu đây là những gì giúp bạn quyết định.

C: \ Users \ Qwerty> http-server - trợ giúp
sử dụng: http-server [path] [tùy chọn]

tùy chọn:
  -p Cổng để sử dụng [8080]
  -A Địa chỉ để sử dụng [0.0.0.0]
  -d Hiển thị danh sách thư mục [true]
  -i Hiển thị auto Index [đúng]
  -g --gzip Phục vụ các tệp gzip khi có thể [false]
  -e --ext Phần mở rộng tệp mặc định nếu không được cung cấp [none]
  -s --silent Suppress log message từ đầu ra
  --cors [= headers] Kích hoạt CORS thông qua tiêu đề "Access-Control-allow-Origin"
                     Tùy chọn cung cấp danh sách tiêu đề CORS được phân tách bằng dấu phẩy
  -o [path] Mở cửa sổ trình duyệt sau khi khởi động máy chủ
  -c Thời gian bộ nhớ cache (tuổi tối đa) tính bằng giây [3600], ví dụ -c10 trong 10 giây.
               Để tắt bộ nhớ đệm, sử dụng -c-1.
  -U --utc Sử dụng định dạng thời gian UTC trong thông điệp tường trình.

  -P --proxy Dự phòng proxy nếu yêu cầu không thể được giải quyết. ví dụ: http://someurl.com

  -S --ssl Kích hoạt https.
  -C --cert Đường dẫn đến tệp ssl cert (mặc định: cert.pem).
  -K --key Đường dẫn đến tệp khóa ssl (mặc định: key.pem).

  -r --robots Trả lời /robots.txt [Tác nhân người dùng: * \ nDisallow: /]
  -h - trợ giúp In danh sách này và thoát.
C: \ Users \ Qwerty> phục vụ - trợ giúp

  Cách sử dụng: phục vụ.js [tùy chọn] [lệnh]

  Các lệnh:

    trợ giúp Hiển thị trợ giúp

  Tùy chọn:

    -a, --auth Phục vụ phía sau auth cơ bản
    -c, --cache Thời gian tính bằng mili giây cho các tệp bộ đệm trong trình duyệt
    -n, --clipless Đừng sao chép địa chỉ vào clipboard (bị tắt theo mặc định)
    -C, --cors Setup * Tiêu đề CORS để cho phép các yêu cầu từ bất kỳ nguồn gốc nào (bị tắt theo mặc định)
    -h, --help Thông tin sử dụng đầu ra
    -i, --ignore Tập tin và thư mục để bỏ qua
    -o, --open Mở địa chỉ cục bộ trong trình duyệt (bị tắt theo mặc định)
    -p, --port Port để lắng nghe (mặc định là 5000)
    -S, --silent Đừng đăng nhập bất cứ thứ gì vào bàn điều khiển
    -s, --single Phục vụ các ứng dụng trang đơn (đặt `-c` thành 1 ngày)
    -t, --treless Đừng hiển thị cây thống kê (bị tắt theo mặc định)
    -u, --unzipped Tắt nén GZIP
    -v, --version Xuất số phiên bản

Nếu bạn cần theo dõi các thay đổi, hãy xem hostr, ghi nhận câu trả lời của Henry Tseng


14

CHỈ DEMO / PROTO SERVER

Nếu đó là tất cả những gì bạn cần, hãy thử điều này:

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

lưu ý: Bạn cần sử dụng "/index.html" như một phần của địa chỉ của mình, tức là " http: // localhost: 3000 / index.html "


2
Đừng sử dụng phiên bản đồng bộ. مead tạo ống để res từ readStream.
Eduard Bondarenko

1
Câu trả lời tốt nhất nếu bạn cần một con ngựa lừa một lần nhanh & bẩn.
sụp đổ

1
Nếu bạn muốn tránh sử dụng index.htmlnhư một phần của địa chỉ của bạn, chỉ cần thêm if (req.url === '/') req.url = '/index.html';ngay sau đó res.writeHead(200);.
Joseph Cho

3
@EduardBondarenko nói đúng. const stream = fs.createReadStream(...); stream.pipe(res);là tất cả những gì bạn cần
Justin Meiners

8

Có một máy chủ web tĩnh khác khá hay: đồng bộ hóa trình duyệt.

Nó có thể được tải xuống bằng trình quản lý gói nút:

npm install -g browser-sync

Sau khi cài đặt, điều hướng đến thư mục dự án trong dấu nhắc cmd và chỉ cần chạy như sau:

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

Nó sẽ bắt đầu phục vụ tất cả các tệp trong thư mục hiện tại trong trình duyệt.

Nhiều hơn có thể được tìm thấy từ BrowserSync

Cảm ơn.


2
Ưu điểm của việc sử dụng Browseersync thay vì các máy chủ tĩnh khác là nó trực tiếp cập nhật trang bất cứ khi nào các tệp được chỉ định bởi --filescờ thay đổi (nb. Bạn không cần chỉ định ./*- chỉ những máy chủ mà bạn muốn Browseersync chủ động theo dõi các bản cập nhật, ví dụ . css/*.css)
Nick F

7

Tôi đã không gặp nhiều may mắn với bất kỳ câu trả lời nào trên trang này, tuy nhiên, dưới đây dường như là một mẹo nhỏ.

Thêm một server.jstệp có nội dung sau:

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)

Cũng đảm bảo rằng bạn yêu cầu express. Chạy yarn add express --savehoặc npm install express --savetùy thuộc vào thiết lập của bạn (Tôi có thể khuyên bạn nên yarnchạy khá nhanh).

Bạn có thể thay đổi distthành bất kỳ thư mục nào bạn đang phục vụ nội dung của bạn. Đối với dự án đơn giản của tôi, tôi đã không phục vụ từ bất kỳ thư mục nào, vì vậy tôi chỉ cần xóa disttên tệp.

Sau đó, bạn có thể chạy node server.js. Khi tôi phải tải dự án của mình lên máy chủ Heroku, tôi cần thêm phần sau vào package.jsontệp của mình :

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

6

Nếu bạn sử dụng khung Express , chức năng này đã sẵn sàng hoạt động.

Để thiết lập một ứng dụng phục vụ tập tin đơn giản, chỉ cần làm điều này:

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

Tôi có thể cài đặt $ npm -g express không; họ $ thể hiện?
Paul Verest

Tôi đã làm theo các bước của bạn, nhưng thể hiện của tôi không có thư mục bin
Qwerty

6

Đây là dự án thú cưng máy chủ web tệp một tệp / nhẹ node.js mà không phụ thuộc mà tôi tin là một công cụ nhanh và phong phú mà việc sử dụng nó dễ dàng như phát lệnh này trên thiết bị đầu cuối Linux / Unix / macOS của bạn ( hoặc termux trên Android) khi node.js (hoặc nodejs-legacytrên Debian / Ubuntu) được cài đặt:

curl pad.js.org | node 

(các lệnh khác nhau tồn tại cho người dùng Windows trên tài liệu)

Nó hỗ trợ những thứ khác nhau mà tôi tin rằng có thể được tìm thấy hữu ích,

  • Tạo / phục vụ chỉ mục thư mục phân cấp
    • Với khả năng sắp xếp theo các tiêu chí khác nhau
    • Tải lên từ trình duyệt bằng [nhiều tệp] kéo và thả và sao chép tệp chỉ dán văn bản và dán màn hình vào hệ thống trên Chrome, Firefox và các trình duyệt khác có thể có một số hạn chế (có thể tắt bằng dòng lệnh tùy chọn nó cung cấp)
    • Nút thư mục / ghi chú / tải lên
  • Cung cấp MIME chính xác cho các loại tệp nổi tiếng (có khả năng vô hiệu hóa điều đó)
  • Khả năng cài đặt dưới dạng gói npm và công cụ cục bộ hoặc, cài đặt một tuyến tính như một dịch vụ vĩnh viễn với Docker
  • Phục vụ tệp HTTP 206 (truyền nhiều tệp) để truyền nhanh hơn
  • Tải lên từ thiết bị đầu cuối và bảng điều khiển trình duyệt (thực tế ban đầu nó được dự định là proxy hệ thống tệp cho bảng điều khiển JS của trình duyệt trên các trang / miền khác)
  • Tải xuống / tải lên CORS (cũng có thể tắt)
  • Tích hợp HTTPS dễ dàng
  • Tùy chọn dòng lệnh nhẹ để đạt được phục vụ an toàn tốt hơn với nó:
    • Với bản vá của tôi trên node.js 8 , bạn có thể có quyền truy cập vào các tùy chọn mà không cần cài đặt trước:curl pad.js.org | node - -h
    • Hoặc trước tiên cài đặt nó dưới dạng gói npm toàn hệ thống [sudo] npm install -g pad.jsvà sau đó sử dụng phiên bản đã cài đặt của nó để có quyền truy cập vào các tùy chọn của nó:pad -h
    • Hoặc sử dụng hình ảnh Docker được cung cấp sử dụng các tùy chọn tương đối an toàn theo mặc định. [sudo] docker run --restart=always -v /files:/files --name pad.js -d -p 9090:9090 quay.io/ebraminio/pad.js

Ảnh chụp màn hình của một chỉ mục thư mục bằng cách sử dụng công cụ

Các tính năng được mô tả ở trên hầu hết được ghi lại trên trang chính của công cụ http://pad.js.org mà bằng một số mẹo hay mà tôi đã sử dụng cũng là nơi mà nguồn công cụ cũng được phục vụ từ đó!

Nguồn công cụ có trên GitHub chào đón phản hồi, yêu cầu tính năng và ands của bạn!


5

Từ npm@5.2.0, npmbắt đầu cài đặt nhị phân mới cùng với npm thông thường được gọi npx. Vì vậy, bây giờ, một lớp lót để tạo máy chủ http tĩnh từ thư mục hiện tại:

npx serve

hoặc là

npx http-server

4

Để tăng hiệu suất mạnh mẽ bằng cách sử dụng nút để phục vụ tài nguyên tĩnh, tôi khuyên bạn nên sử dụng Buffet . Nó hoạt động tương tự như một trình tăng tốc ứng dụng web còn được gọi là proxy ngược HTTP lưu trữ nhưng nó chỉ tải thư mục đã chọn vào bộ nhớ.

Buffet thực hiện một cách tiếp cận được đệm hoàn toàn - tất cả các tệp được tải đầy đủ vào bộ nhớ khi ứng dụng của bạn khởi động, do đó bạn sẽ không bao giờ cảm thấy sự đốt cháy của hệ thống tệp. Trong thực tế, điều này là vô cùng hiệu quả. Vì vậy, việc đặt Varnish trước ứng dụng của bạn thậm chí có thể làm cho nó chậm hơn! 

Chúng tôi sử dụng nó trên trang web codePile và thấy tăng ~ 700 yêu cầu / giây lên> 4k yêu cầu / giây trên trang tải xuống 25 tài nguyên dưới tải kết nối người dùng đồng thời 1k.

Thí dụ:

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

Dưới đây làm việc cho tôi:

Tạo một tệp app.jscó nội dung dưới đây:

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

Tạo một tệp index.htmlcó nội dung dưới đây:

Hi

Bắt đầu một dòng lệnh:

cmd

Chạy bên dưới trong cmd:

node app.js

Goto bên dưới URL, bằng chrome:

http://localhost:8080/index.html

Đó là tất cả. Mong rằng sẽ giúp.

Nguồn: https://nodejs.org/en/ledgeledge/HTTP/servers/how-to-serve-static-files/


3

Bạn có thể thử phục vụ tôi

Sử dụng nó rất dễ dàng:

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

Đó là tất cả.

PD: Thư mục được phục vụ theo mặc định là "công khai".


3

Đây là một máy chủ web đơn giản khác.

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

Tải về

npm install -g hostr

Thay đổi giám đốc làm việc

cd myprojectfolder/

Và bắt đầu

hostr

Điều này cũng theo dõi các thay đổi và cung cấp tải lại trực tiếp.
Qwerty

3

Trong tệp node.js đơn giản:

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

Đây là một máy chủ node.js đơn giản chỉ phục vụ các tệp được yêu cầu trong một thư mục nhất định.

Sử dụng:

node server.js folder port

foldercó thể là tuyệt đối hoặc tương đối tùy thuộc vào server.jsvị trí. Giá trị mặc định là .thư mục bạn thực thi node server.jslệnh.

port là 8080 theo mặc định nhưng bạn có thể chỉ định bất kỳ cổng nào có sẵn trong HĐH của bạn.

Trong trường hợp của bạn, tôi sẽ làm:

cd D:\Folder
node server.js

Bạn có thể duyệt các tệp bên dưới D:\Foldertừ trình duyệt bằng cách nhậphttp://127.0.0.1:8080/somefolder/somefile.html


2

Tuy nhiên, nó không phải trên NPM, nhưng tôi đã xây dựng một máy chủ tĩnh đơn giản trên Express cũng cho phép bạn chấp nhận gửi biểu mẫu và gửi email cho họ thông qua dịch vụ email giao dịch (Sendgrid bây giờ, Mandrill sắp tới).

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


2

Vì lợi ích của người tìm kiếm, tôi thích câu trả lời của Jakub g, nhưng muốn xử lý một chút lỗi. Rõ ràng là tốt nhất để xử lý lỗi đúng cách , nhưng điều này sẽ giúp ngăn chặn một trang web dừng lại nếu xảy ra lỗi. Mã dưới đây:

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

Cập nhật - Câu trả lời của tôi hoạt động, nhưng bây giờ tôi sử dụng câu trả lời của @Matt Self bằng cách sử dụng máy chủ http. Có vẻ như để làm việc tốt.
HockeyJ

2

Đầu tiên cài đặt máy chủ nút tĩnh thông qua npm install node-static -g -g là cài đặt toàn cầu trên hệ thống của bạn, sau đó điều hướng đến thư mục chứa các tệp của bạn, khởi động máy chủ với static nó lắng nghe trên cổng 8080, điều hướng đến trình duyệt và gõ localhost: 8080 / yourhtmlfilename .


2

Bạn có thể sử dụng NPM phục vụ gói cho việc này, nếu bạn không cần công cụ NodeJS thì đây là một công cụ nhanh chóng và dễ sử dụng:

1 - Cài đặt gói trên PC của bạn:

npm install -g serve

2 - Phục vụ thư mục tĩnh của bạn với serve <path>:

d:> serve d:\StaticSite

Nó sẽ cho bạn thấy cổng nào thư mục tĩnh của bạn đang được phục vụ, chỉ cần điều hướng đến máy chủ như:

http://localhost:3000

Bạn nhận ra rằng đó npmlà trình quản lý gói nút nên trên thực tế bạn đang sử dụng công cụ NodeJS
derickito

Tôi làm, ý của tôi là "NodeJS Stuff" là sử dụng NodeJS và express để phục vụ các tệp như hầu hết các câu trả lời được đề xuất. Phục vụ là một thực thi độc lập, NPM được sử dụng chỉ để cài đặt nó, bạn có thể chỉ cần tải xuống trực tiếp.
Diego Mendes

1

Tìm kiếm trong sổ đăng ký NPM https://npmjs.org/search?q=server , tôi đã tìm thấy máy chủ tĩnh https://github.com/maelstrom/static-server

Bạn đã bao giờ cần gửi cho đồng nghiệp một tập tin, nhưng không thể gửi email cho con thú 100MB? Muốn chạy một ứng dụng JavaScript ví dụ đơn giản, nhưng gặp vấn đề với việc chạy nó thông qua tệp: giao thức ///? Muốn chia sẻ thư mục phương tiện của bạn tại mạng LAN mà không cần thiết lập Samba hoặc FTP hoặc bất cứ điều gì khác yêu cầu bạn chỉnh sửa các tệp cấu hình? Sau đó, máy chủ tập tin này sẽ làm cho cuộc sống của bạn dễ dàng hơn một chút.

Để cài đặt máy chủ công cụ tĩnh đơn giản, sử dụng npm:

npm install -g static-server

Sau đó, để phục vụ một tập tin hoặc một thư mục, chỉ cần chạy

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

Điều đó thậm chí có thể liệt kê nội dung thư mục.

Thật không may, nó không thể phục vụ các tập tin :)


5
Tôi đã xây dựng máy chủ đó. Máy chủ tệp đó được xây dựng dựa trên phiên bản Node rất cũ, do đó tại sao nó không hoạt động nữa. Tôi không có thời gian để sửa chữa nó. Tôi đề nghị sử dụng câu trả lời của @Oleg ở trên. Nó có thể dễ dàng được bó vào một nút nhỏ có thể thực thi được, và về cơ bản là những gì tôi đã làm.
Tim Heap

Cảm ơn Tim, phản hồi rất chuyên nghiệp. Tôi sẽ không xóa mã mặc dù, nhưng cập nhật readme.
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);


Bạn nên thêm một số lời giải thích với mã này.
Abhinav Gauniyal

1

Nếu bạn đang quan tâm đến máy chủ http siêu nhẹ mà không có bất kỳ điều kiện tiên quyết nào, bạn nên xem qua: mongoose



0

Bạn cũng đã hỏi tại sao các yêu cầu giảm - không chắc lý do cụ thể trong trường hợp của bạn là gì, nhưng nói chung, máy chủ của bạn có nội dung tĩnh tốt hơn bằng cách sử dụng phần mềm trung gian chuyên dụng (nginx, S3, CDN) vì Node thực sự không được tối ưu hóa cho mẫu mạng này. Xem giải thích thêm tại đây (đạn 13): http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.