Sử dụng node.js như một máy chủ web đơn giản


1103

Tôi muốn chạy một máy chủ HTTP rất đơn giản. Mọi yêu cầu GET example.comphải được index.htmlphục vụ cho nó nhưng như một trang HTML thông thường (nghĩa là, trải nghiệm giống như khi bạn đọc các trang web bình thường).

Sử dụng mã dưới đây, tôi có thể đọc nội dung của index.html. Làm thế nào để tôi phục vụ index.htmlnhư một trang web thông thường?

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

Một gợi ý dưới đây rất phức tạp và yêu cầu tôi viết một getdòng cho mỗi tệp tài nguyên (CSS, JavaScript, hình ảnh) mà tôi muốn sử dụng.

Làm cách nào tôi có thể phục vụ một trang HTML duy nhất với một số hình ảnh, CSS và JavaScript?


21
Có một cái nhìn vào mô-đun npm "kết nối". Nó cung cấp chức năng cơ bản như vậy và là cơ sở của nhiều thiết lập và các gói khác.
Mörre

5
Bạn nên đặt giải pháp của bạn như một câu trả lời và đánh dấu nó chính xác.
graham.reeds

8
Tôi đã có thể tìm ra một giải pháp hoàn hảo bởi Eric B. Sowell có tên là Phục vụ các tệp tĩnh từ nút js . Đọc toàn bộ. Rất khuyến khích.
idophir

1
Có một cái nhìn vào một mô-đun tôi đã viết được gọi là Cachemere. Nó cũng tự động lưu trữ tất cả các tài nguyên của bạn. github.com/topcloud/cachemere
Jon

1
local-web-server là một ví dụ điển hình để xem xét
Lloyd

Câu trả lời:


993

Máy chủ Node.js đơn giản nhất chỉ là:

$ npm install http-server -g

Bây giờ bạn có thể chạy một máy chủ thông qua các lệnh sau:

$ cd MyApp

$ http-server

Nếu bạn đang sử dụng NPM 5.2.0 trở lên, bạn có thể sử dụng http-servermà không cần cài đặt nó npx. Điều này không được khuyến khích sử dụng trong sản xuất nhưng là một cách tuyệt vời để nhanh chóng có được một máy chủ chạy trên localhost.

$ npx http-server

Hoặc, bạn có thể thử điều này, mở trình duyệt web của bạn và kích hoạt các yêu cầu CORS:

$ http-server -o --cors

Để biết thêm tùy chọn, hãy xem tài liệu cho http-servertrên GitHub hoặc chạy:

$ http-server --help

Rất nhiều tính năng hay khác và triển khai đơn giản đến chết người cho NodeJitsu.

Dĩa đặc trưng

Tất nhiên, bạn có thể dễ dàng nạp các tính năng với ngã ba của riêng bạn. Bạn có thể thấy nó đã được thực hiện ở một trong hơn 800 dĩa hiện có của dự án này:

Light Server: Một sự thay thế tự động làm mới

Một thay thế tốt đẹp http-serverlight-server. Nó hỗ trợ xem tập tin và tự động làm mới và nhiều tính năng khác.

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

Thêm vào menu ngữ cảnh thư mục của bạn trong 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\""

Máy chủ JSON REST đơn giản

Nếu bạn cần tạo một máy chủ REST đơn giản cho một dự án nguyên mẫu thì json-server có thể là thứ bạn đang tìm kiếm.

Trình chỉnh sửa tự động làm mới

Hầu hết các trình soạn thảo trang web và các công cụ IDE hiện nay bao gồm một máy chủ web sẽ xem các tệp nguồn của bạn và tự động làm mới trang web của bạn khi chúng thay đổi.

Tôi sử dụng Live Server với Visual Studio Code.

Các mã nguồn mở soạn thảo văn bản Chân đế cũng bao gồm một NodeJS máy chủ web tĩnh. Chỉ cần mở bất kỳ tệp HTML nào trong Chân đế, nhấn " Xem trước trực tiếp " và nó khởi động một máy chủ tĩnh và mở trình duyệt của bạn tại trang. Trình duyệt sẽ ** tự động làm mới bất cứ khi nào bạn chỉnh sửa và lưu tệp HTML. Điều này đặc biệt hữu ích khi thử nghiệm các trang web thích ứng. Mở trang HTML của bạn trên nhiều trình duyệt / kích thước cửa sổ / thiết bị. Lưu trang HTML của bạn và ngay lập tức xem liệu công cụ thích ứng của bạn có hoạt động không khi tất cả đều tự động làm mới.

Nhà phát triển PhoneGap

Nếu bạn đang mã hóa một ứng dụng di động lai , bạn có thể muốn biết rằng nhóm PhoneGap đã đưa khái niệm tự động làm mới này lên máy bay với Ứng dụng PhoneGap mới của họ . Đây là một ứng dụng di động chung có thể tải các tệp HTML5 từ máy chủ trong quá trình phát triển. Đây là một mẹo rất khó vì bây giờ bạn có thể bỏ qua các bước biên dịch / triển khai chậm trong chu kỳ phát triển của mình cho các ứng dụng di động lai nếu bạn đang thay đổi các tệp JS / CSS / HTML - đó là điều bạn đang làm hầu hết thời gian. Họ cũng cung cấp máy chủ web NodeJS tĩnh (chạy phonegap serve) phát hiện các thay đổi tệp.

Nhà phát triển PhoneGap + Sencha Touch

Bây giờ tôi đã điều chỉnh rộng rãi máy chủ tĩnh PhoneGap & Ứng dụng dành cho nhà phát triển PhoneGap cho các nhà phát triển Sencha Touch & jQuery Mobile. Kiểm tra nó tại Sencha Touch Live . Hỗ trợ --qr Mã QR và --localtunnel ủy nhiệm máy chủ tĩnh của bạn từ máy tính để bàn của bạn đến một URL bên ngoài tường lửa của bạn! Tấn sử dụng. Tăng tốc lớn cho các nhà phát triển di động lai.

Nhà phát triển khung Cordova + Ionic

Máy chủ cục bộ và các tính năng tự động làm mới được đưa vào ioniccông cụ. Chỉ cần chạy ionic servetừ thư mục ứng dụng của bạn. Thậm chí tốt hơn ... ionic serve --labđể xem tự động làm mới các chế độ xem cạnh nhau của cả iOS và Android.


9
npm install live-server -g nếu bạn muốn điều tương tự, nhưng với tự động tải lại khi phát hiện thay đổi tệp

3
Một chút "gotcha" -. http-server mặc định phục vụ trang web tại 0.0.0.0. Do đó, bạn PHẢI chỉ định một địa chỉ IP để nó hoạt động chính xác như một công cụ kiểm tra cục bộ:http-server -a localhost
JESii

1
Có ... 0.0.0.0 sẽ khiến nó liên kết với TẤT CẢ IP của tất cả các thiết bị được kết nối mạng IP của bạn (WiFi, Cáp, Bluetooth), đó là một ý tưởng tồi trên bất kỳ mạng công cộng nào vì bạn có thể bị hack. Sẽ không tệ lắm nếu bạn chỉ muốn giới thiệu ứng dụng của mình trong mạng có tường lửa an toàn để hiển thị cho người khác hoặc kết nối nó với thiết bị di động của bạn trên cùng một mạng.
Tony O'Hagan

Công cụ nhỏ thực sự hữu ích. Tôi có rất nhiều ứng dụng Node đang chạy trên máy chủ của mình, vì vậy tôi thêm tùy chọn "-p" để chọn một cổng khác ngoài 8080. Ví dụ: nohup http-server -p 60080 & (khởi động nó trong nền và cho phép bạn ngắt kết nối khỏi shell shell.) Bạn nên đảm bảo rằng cổng được mở ra thế giới, ví dụ: iptables -I INPUT 1 -p tcp --dport 60090 -j CHẤP NHẬN (trên nhiều hệ thống Linux)
Blisterpeanuts 11/12/17

Làm thế nào để chạy nó như một dịch vụ, vì vậy tôi có thể sử dụng nó ngay cả bằng cách đóng dấu nhắc lệnh. Có công cụ nào cung cấp loại này nếu không phải cái này.
Sandeep cát

983

Bạn có thể sử dụng ConnectServeStatic với Node.js cho việc này:

  1. Cài đặt kết nối và phục vụ tĩnh với NPM

    $ npm install connect serve-static
  2. Tạo tệp server.js với nội dung này:

    var connect = require('connect');
    var serveStatic = require('serve-static');
    
    connect()
        .use(serveStatic(__dirname))
        .listen(8080, () => console.log('Server running on 8080...'));
  3. Chạy với Node.js

    $ node server.js

Bây giờ bạn có thể đi đến http://localhost:8080/yourfile.html


24
Ý tưởng là không sử dụng một thư viện hiện có, vì lý do giáo dục, nhưng tôi nghĩ sử dụng Express là một lời khuyên tốt hơn so với phiên bản cấp thấp hơn, Connect.
idophir

135
Phần của Express phục vụ tệp tĩnh chỉ là Kết nối, vì vậy tôi không thấy lý do để sử dụng Express để phục vụ các tệp tĩnh. Nhưng vâng, Express cũng sẽ làm được việc.
Gian Marco Gherardi

7
Lời khuyên tuyệt vời. Các bước trên làm việc cho mục đích của tôi rất tốt. Nhờ Gian, Đây là liên kết đến Express nơi nó tiết lộ nó được xây dựng trên Connect, expressjs.com Đây là cách sử dụng Express: expressjs.com/guide.html
Jack Stone

10
Không làm việc cho tôi, kết quả không thể GET /test.html. Tôi có nên thay thế __dirname bằng tên thư mục không?
Timo

3
Bây giờ, kết nối đã thay đổi thành phiên bản 3. Do đó, người ta phải sử dụng dịch vụ tĩnh như miqid mô tả. Tôi đã đăng một câu trả lời khác với mã đầy đủ để kết nối v3.
tomet

160

Kiểm tra ý chính này . Tôi đang sao chép nó ở đây để tham khảo, nhưng ý chính đã được cập nhật thường xuyên.

Node.JS máy chủ web tệp tĩnh. Đặt nó trong đường dẫn của bạn để kích hoạt các máy chủ trong bất kỳ thư mục nào, cần một đối số cổng tùy chọn.

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

Cập nhật

Các ý chính xử lý các tập tin css và js. Tôi đã sử dụng nó cho mình. Sử dụng đọc / ghi ở chế độ "nhị phân" không phải là vấn đề. Điều đó chỉ có nghĩa là tệp không được hiểu là văn bản của thư viện tệp và không liên quan đến loại nội dung được trả về trong phản hồi.

Vấn đề với mã của bạn là bạn luôn trả về loại nội dung "văn bản / thuần túy". Đoạn mã trên không trả về bất kỳ loại nội dung nào, nhưng nếu bạn chỉ sử dụng nó cho HTML, CSS và JS, một trình duyệt có thể suy ra những thứ đó tốt. Không có loại nội dung nào tốt hơn loại sai.

Thông thường loại nội dung là một cấu hình của máy chủ web của bạn. Vì vậy, tôi xin lỗi nếu điều này không giải quyết được vấn đề của bạn , nhưng nó hoạt động với tôi như một máy chủ phát triển đơn giản và nghĩ rằng nó có thể giúp một số người khác. Nếu bạn cần loại nội dung chính xác trong phản hồi, bạn cần xác định rõ ràng chúng là joeytwiddle có hoặc sử dụng thư viện như Connect có mặc định hợp lý. Điều tuyệt vời ở đây là nó đơn giản và khép kín (không phụ thuộc).

Nhưng tôi cảm thấy vấn đề của bạn. Vì vậy, đây là giải pháp kết hợp.

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

3
Điều này không thực sự giải quyết được "vấn đề". Bạn trả về index.html dưới dạng tệp nhị phân và bạn không xử lý css và js.
idophir

4
Nó xử lý css và js. Nó không trả về index.html dưới dạng tệp nhị phân. Nó chỉ đơn giản là sao chép dữ liệu ra khỏi đĩa ở bất kỳ định dạng nào. Vui lòng xem các bản cập nhật để được giải thích thêm.
Jonathan Trần

một vấn đề với mã, nó phân biệt chữ hoa chữ thường, trên unix đối với một số tệp nhất định, nó cung cấp 404
Pradeep

2
Lưu ý rằng "path.exists và path.existsSync hiện không được chấp nhận. Vui lòng sử dụng fs.exists và fs.existsSync." stackoverflow.com/a/5008295/259
David Sykes

3
Lưu ý rằng fs.exists()bây giờ cũng không được chấp nhận. Bắt lỗi trên fs.stat()thay vì tạo một điều kiện cuộc đua.
Matt

100

Bạn không cần thể hiện. Bạn không cần kết nối. Node.js không http TỰ NHIÊN. Tất cả bạn cần làm là trả lại một tệp phụ thuộc vào yêu cầu:

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)    

Một ví dụ đầy đủ hơn đảm bảo các yêu cầu không thể truy cập các tệp bên dưới thư mục cơ sở và xử lý lỗi thích hợp:

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)

3
Nếu tôi không nhầm, giải pháp này không quan tâm đến loại mã hóa, vì vậy các yêu cầu cho các trang và hình ảnh HTML sẽ có cùng mã hóa. Phải không?
idophir

2
@idophir Thông thường mã hóa không thành vấn đề, các trình duyệt suy luận dựa trên các thẻ html được sử dụng hoặc thông tin khác hoặc họ đoán thực sự tốt. Giống như ai đó đã đề cập ở trên, không có loại MIME nào tốt hơn loại sai. Bạn chắc chắn có thể sử dụng một cái gì đó giống như nút-mime để tìm ra các loại tệp mime, nhưng một máy chủ http tuân thủ đầy đủ web nằm ngoài phạm vi của câu hỏi này.
BT

1
@Rooster Bạn không cần bất cứ điều gì đặc biệt - đơn giản node thisfile.js. Nó sẽ chạy, lắng nghe các kết nối mới và trả về kết quả mới, cho đến khi A. nó bị đóng bởi tín hiệu hoặc B. một số lỗi điên rồ nào đó gây ra sự chấm dứt chương trình.
BT

1
@Rooster Một trình nền khác của một số danh tiếng được tìm thấy tại github.com/Unitech/pm2
Travelling Man

1
Tôi thích câu trả lời này nhất, nhưng có hai vấn đề: 1) Nó trả về 200 khi trả về 404; để khắc phục, tôi gọi writeHead (200) trong cuộc gọi lại 'mở'. 2) Nếu có lỗi, ổ cắm bị mở; để khắc phục, tôi gọi answer.destroy () trong cuộc gọi lại 'lỗi'.
Paul Brannan

70

Tôi nghĩ rằng phần bạn đang thiếu hiện tại là bạn đang gửi:

Content-Type: text/plain

Nếu bạn muốn trình duyệt web hiển thị HTML, bạn nên đổi nó thành:

Content-Type: text/html

Cảm ơn đã trả lời nhanh chóng. Trang hiện tải nhưng không có CSS. Làm cách nào tôi có thể có được một trang html tiêu chuẩn với CSS và JS được tải?
idophir

20
Bạn cần bắt đầu mở rộng máy chủ đó. Ngay bây giờ nó chỉ biết cách phục vụ index.html - bạn cần dạy nó cách phục vụ foo.css và foo.js ngay bây giờ, với các loại MIME phù hợp của riêng họ.
clee

1
Nếu bạn không muốn phục vụ các tệp tĩnh, bạn có thể thả css của mình vào <style>thẻ.
Keith

1
Sau chín năm, điều này thực sự nên được chấp nhận là câu trả lời chính xác.
rooch84

46

Bước 1 (bên trong dấu nhắc lệnh [Tôi hy vọng bạn cd ĐẾN NỀN TẢNG CỦA BẠN]): npm install express

Bước 2: Tạo tệp 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);

Xin lưu ý, bạn cũng nên thêm WATCHFILE (hoặc sử dụng gật đầu). Mã trên chỉ dành cho một máy chủ kết nối đơn giản.

BƯỚC 3: node server.jshoặcnodemon server.js

Bây giờ có phương pháp dễ dàng hơn nếu bạn chỉ muốn lưu trữ máy chủ HTTP đơn giản. npm install -g http-server

và mở thư mục của chúng tôi và gõ http-server

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


@STEEL, có cách nào để tự động khởi động máy chủ nút không. Ý tôi là không đi đến đường dẫn thư mục và sau đó gõ nút máy chủ thì chỉ có nó sẽ bắt đầu. tôi muốn khởi động máy chủ nút như IIS. bạn có thể cho tôi biết
Vinoth

@Vinoth vâng có nhiều cách. Mục đích hoặc mục tiêu chính xác của bạn là gì, tôi có thể giúp bạn
THÉP

@steel tôi muốn khởi động máy chủ tự động mà không cần cho máy chủ nút trong lệnh promt. đây là yêu cầu của tôi, bạn có thể cho tôi biết một vài ví dụ
Vinoth

Bạn sẽ cần sử dụng một số công cụ như Th thinkWorks GO, có thể thực thi các lệnh Terminal từ một cú nhấp chuột từ trình duyệt.
THÉP

32

Cách nhanh chóng:

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

Cách của bạn:

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

19

Thay vì xử lý một câu lệnh chuyển đổi, tôi nghĩ rằng việc tìm kiếm loại nội dung từ từ điển sẽ gọn gàng hơn:

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

...

    var contentType = contentTypesByExtension[fileExtension] || 'text/plain';

Có, trông thanh lịch hơn nhiều so với giải pháp "chuyển đổi" được sử dụng bởi Eric B. Sowell (xem câu trả lời được chọn). Cảm ơn.
idophir

Câu trả lời này hoàn toàn nằm ngoài ngữ cảnh ... Nó đề cập đến liên kết này trong bình luận này - stackoverflow.com/questions/6084360/ ((vâng, sao cũng được, internet bị hỏng)
Mars Robertson

15

Về cơ bản, đây là phiên bản cập nhật của câu trả lời được chấp nhận cho kết nối phiên bản 3:

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

var app = connect();

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

Tôi cũng đã thêm một tùy chọn mặc định để index.html được phục vụ như một mặc định.


13

Bạn không cần sử dụng bất kỳ mô-đun NPM nào để chạy một máy chủ đơn giản, có một thư viện rất nhỏ gọi là " Máy chủ miễn phí NPM " cho Node:

50 dòng mã, xuất ra nếu bạn đang yêu cầu một tệp hoặc một thư mục và cung cấp cho nó một màu đỏ hoặc màu xanh lá cây nếu nó không hoạt động. Kích thước nhỏ hơn 1KB (rút gọn).


Sự lựa chọn tuyệt vời. Phục vụ html, css, js và hình ảnh. Tuyệt vời để gỡ lỗi. Chỉ cần thay thế mã này là dành cho server.js của bạn.

2
Tôi ước tôi có thể thêm nhiều upvote! Điều đó thật tuyệt! Tôi đã thực hiện một thay đổi nhỏ var filename = path.join(process.cwd() + '/dist/', uri); cho máy chủ từ thư mục dist . Tôi đặt mã vào server.jsvà nó chỉ hoạt động khi tôi gõnpm start
John Henckel

Làm thế nào để chạy nó như một dịch vụ, vì vậy tôi có thể sử dụng nó ngay cả bằng cách đóng dấu nhắc lệnh. Có công cụ nào cung cấp loại này nếu không phải cái này.
Sandeep cát

13

Nếu bạn đã cài đặt nút trên PC, có lẽ bạn có NPM, nếu bạn không cần công cụ NodeJS, bạn có thể sử dụng gói phục vụ cho việc này:

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:

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

Làm thế nào để chạy nó như một dịch vụ, vì vậy tôi có thể sử dụng nó ngay cả bằng cách đóng dấu nhắc lệnh. Có công cụ nào cung cấp loại này nếu không phải cái này.
Sandeep cát

Đây phải là câu trả lời được chấp nhận. Bởi vì nó dễ nhất, và nó hoạt động ra khỏi hộp. Do đó, nếu bạn chạy chỉ phục vụ mà không có đường dẫn, nó sẽ chạy máy chủ từ thư mục hiện tại (nơi bạn đã có CD-ed trước đó).
Игор Рајачић

9

Tôi tìm thấy một thư viện thú vị trên npm có thể giúp ích cho bạn. Nó được gọi là mime ( npm install mimehoặc https://github.com/broofa/node-mime ) và nó có thể xác định loại mime của một tệp. Đây là một ví dụ về một máy chủ web mà tôi đã viết bằng cách sử dụng nó:

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

Điều này sẽ phục vụ bất kỳ tệp văn bản hoặc hình ảnh thông thường nào.

Ghi chú của nhà phát triển

Đây là một ví dụ về đầu ra mà tôi có với nó:

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

Lưu ý các unescapechức năng trong việc xây dựng đường dẫn. Điều này là để cho phép tên tệp có dấu cách và ký tự được mã hóa.


8

Biên tập:

Ứng dụng mẫu Node.js Node Chat có chức năng bạn muốn.
Trong đó là README.textfile
3. Bước là thứ bạn đang tìm kiếm.

bước 1

  • tạo một máy chủ phản hồi với hello world trên cổng 8002

bước 2

  • tạo một index.html và phục vụ nó

bước 3

  • giới thiệu produc.js
  • thay đổi logic để bất kỳ tệp tĩnh nào được phục vụ
  • hiển thị 404 trong trường hợp không tìm thấy tập tin

bước 4

  • thêm jquery-1.4.2.js
  • thêm client.js
  • thay đổi index.html để nhắc người dùng cho biệt danh

Đây là server.js

Đây là produc.js


5
Tôi không quan tâm. Tôi chỉ có index.html. Tôi chỉ muốn tải html + css + js. Cảm ơn!
idophir

16
-1 cho .readFileSynctrong một cuộc gọi lại. Với node.js, chúng tôi sử dụng IO không chặn. Xin vui lòng không đề xuất Synccác lệnh.
Raynos

Xin chào @krmby, cảm ơn vì đã cố gắng giúp đỡ. Tôi thực sự mới ở đây. Tôi đã tải xuống cả server.js và produc.js. Khi tôi chạy "node server.js" và thử truy cập trang bằng trình duyệt, tôi gặp lỗi này: TypeError: Object # <ServerResponse> không có phương thức 'đóng' tại /var/www/hppy-site/util.js : 67: 8 tại /var/www/hppy-site/util.js:56:4 tại [Object Object]. <Anonymous> (fs.js: 107: 5) tại [Object Object] .emit (event.js : 61: 17) tại afterRead (fs.js: 970: 12) tại trình bao bọc (fs.js: 245: 17) Có ý tưởng nào không? BTW - điều tương tự đang xảy ra khi tôi tải xuống dự án của bạn và chạy nó.
idophir

1
Lấy làm tiếc. Tôi đã sử dụng một phiên bản mới. Đã thay thế res.close () bằng res.end ()
idophir

8

Cách tôi làm là trước hết là cài đặt máy chủ tĩnh nút trên toàn cầu thông qua

npm install node-static -g

sau đó điều hướng đến thư mục chứa các tệp html của bạn và khởi động máy chủ tĩnh với static.

Đi đến trình duyệt và gõ localhost:8080/"yourHtmlFile".


1
Không có gì đánh bại một lót. Cám ơn!
AndroidDev

Làm thế nào để chạy nó như một dịch vụ, vì vậy tôi có thể sử dụng nó ngay cả bằng cách đóng dấu nhắc lệnh. Có công cụ nào cung cấp loại này nếu không phải cái này.
Sandeep cát

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

Tôi nghĩ bạn nơi tìm kiếm này. Trong index.html của bạn, chỉ cần điền nó bằng mã html thông thường - bất cứ điều gì bạn muốn kết xuất trên đó, như:

<html>
    <h1>Hello world</h1>
</html>

7

Về cơ bản sao chép câu trả lời được chấp nhận, nhưng tránh tạo tệp js.

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

Tìm thấy nó rất thuận tiện.

Cập nhật

Là phiên bản mới nhất của Express, phục vụ tĩnh đã trở thành một phần mềm trung gian riêng biệt. Sử dụng cái này để phục vụ:

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

Cài đặt serve-statictrước.


6

từ trường w3

Thật dễ dàng để tạo một máy chủ nút để phục vụ bất kỳ tệp nào được yêu cầu và bạn không cần phải cài đặt bất kỳ gói nào cho nó

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

sẽ phục vụ file.html từ đĩa



5

Tôi sử dụng mã dưới đây để bắt đầu một máy chủ web đơn giản, hiển thị tệp html mặc định nếu không có tệp nào được đề cập trong 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);

Nó sẽ kết xuất tất cả các tệp js, css và hình ảnh, cùng với tất cả nội dung html.

Đồng ý với tuyên bố " Không có loại nội dung nào tốt hơn loại sai "


5

Tôi không chắc đây có phải là chính xác những gì bạn muốn không, tuy nhiên, bạn có thể thử thay đổi:

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

đến đây:

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

Điều này sẽ có trình duyệt máy khách hiển thị tệp dưới dạng html thay vì văn bản thuần túy.


1
Đây không phải là giống như câu trả lời hiện có ?
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'

6
Các Content-Typenên text/html, vì nó được định nghĩa như vậy: Content-Type := type "/" subtype *[";" parameter].
t.niese

1
điều này dường như biến tất cả các tệp của tôi trong thư mục đó thành loại html, ngay cả khi đó là js ...
ahnbizcad

Hoạt động tuyệt vời ....
smack cherry

4

Một phiên bản 4.x dài hơn một chút nhưng cung cấp danh sách thư mục, nén, lưu trữ và yêu cầu đăng nhập trong một số dòng tối thiểu

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 !")

4

Số lượng lớn các câu trả lời phức tạp ở đây. Nếu bạn không có ý định xử lý tệp / cơ sở dữ liệu nodeJS mà chỉ muốn cung cấp html / css / js / hình ảnh tĩnh như câu hỏi của bạn đề xuất thì chỉ cần cài đặt máy chủ Pushstate mô-đun hoặc tương tự;

Đây là một "lớp lót" sẽ tạo và khởi chạy một trang web nhỏ. Chỉ cần dán toàn bộ khối đó trong thiết bị đầu cuối của bạn trong thư mục thích hợp.

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

Mở trình duyệt và truy cập http: // localhost: 3000 . Làm xong.

Máy chủ sẽ sử dụng appthư mục làm gốc để phục vụ các tệp từ đó. Để thêm tài sản bổ sung, chỉ cần đặt chúng trong thư mục đó.


2
Nếu bạn đã có số liệu thống kê, bạn chỉ có thể sử dụng các mục sau:npm install pushstate-server --save; touch server.js; echo "var server = require('pushstate-server');server.start({ port: 3000, directory: './' });" > server.js; node server.js
Xoay

4

Đã có một số giải pháp tuyệt vời cho một đơn giản nodejs server. Có một giải pháp nữa nếu bạn cần live-reloadingkhi bạn thay đổi tệp của mình.

npm install lite-server -g

điều hướng thư mục của bạn và làm

lite-server

nó sẽ mở trình duyệt cho bạn với tải lại trực tiếp.


4

Hàm ExpressFile thực hiện chính xác những gì bạn cần và vì bạn muốn chức năng máy chủ web từ nút, express là lựa chọn tự nhiên và sau đó phục vụ các tệp tĩnh trở nên dễ dàng như sau:

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

đọc thêm tại đây: https://expressjs.com/en/api.html#res.sendFile

Một ví dụ nhỏ với máy chủ web express cho nút:

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

chạy cái này và điều hướng đến http: // localhost: 8080

Để mở rộng về điều này để cho phép bạn phục vụ các tệp tĩnh như css và hình ảnh, đây là một ví dụ khác:

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

vì vậy hãy tạo một thư mục con có tên là css, đặt nội dung tĩnh của bạn vào đó và nó sẽ có sẵn cho index.html của bạn để dễ dàng tham khảo như:

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

Lưu ý đường dẫn tương đối trong href!

thì đấy!


3

Hầu hết các câu trả lời ở trên mô tả rất độc đáo cách thức nội dung đang được phục vụ. Những gì tôi đang tìm kiếm bổ sung là danh sách các thư mục để các nội dung khác của thư mục có thể được duyệt. Đây là giải pháp của tôi cho độc giả hơn nữa:

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

2

Đây là một trong những giải pháp nhanh nhất tôi sử dụng để nhanh chóng xem các trang web

sudo npm install ripple-emulator -g

Từ đó trở đi, chỉ cần nhập thư mục của các tệp html của bạn và chạy

ripple emulate

sau đó thay đổi thiết bị thành phong cảnh Nexus 7.


5
Nexus 7 phải làm gì với điều này?
waeltken

2

Phiên bản đơn giản hơn mà tôi đã gặp là như sau. Đối với mục đích giáo dục, nó là tốt nhất, bởi vì nó không sử dụng bất kỳ thư viện trừu tượng.

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

Bây giờ hãy vào trình duyệt và mở như sau:

http://127.0.0.1/image.jpg

Ở đây image.jpgnên ở cùng thư mục với tập tin này. Hy vọng điều này sẽ giúp được ai đó :)


Bạn không nên thần thánh loại mime từ tên tệp.
mwieczorek

Lưu ý: fs.exists () đã không được dùng nữa, fs.existsSync () là sự thay thế trực tiếp.
JWAspin

@mwieczorek nên làm thế nào để được thần thánh? Bạn có nhớ rằng anh ấy đang tách phần mở rộng tập tin?
James Newton

Có thể muốn sử dụng: let mimeType = mimeTypes [filename.split ("."). Pop ()] || "application / octet-stream"
James Newton

1

Tôi cũng có thể giới thiệu SugoiJS, nó rất dễ cài đặt và cung cấp tùy chọn để bắt đầu viết nhanh và có các tính năng tuyệt vời.

Hãy xem tại đây để bắt đầu: http://demo.sugoijs.com/ , tài liệu: https://wiki.sugoijs.com/

Nó có yêu cầu xử lý trang trí, yêu cầu chính sách và trang trí chính sách ủy quyền.

Ví dụ:

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

1

Rất dễ dàng với hàng tấn thư viện trình bày ngày hôm nay. Câu trả lời ở đây là chức năng. Nếu bạn muốn một phiên bản khác để bắt đầu nhanh hơn và đơn giản

Tất nhiên đầu tiên cài đặt node.js. Một lát sau:

> # 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

Đây là nội dung của " https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express-static.js " (bạn không cần tải xuống, tôi đã đăng để hiểu cách thức hoạt động phía sau)

// 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")
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.