Ładowanie podstawowego HTMLa w Node.js


207

Próbuję dowiedzieć się, jak załadować i renderować podstawowy plik HTML, aby nie musiałem pisać kodu:

response.write('...<p>blahblahblah</p>...');

Odpowiedzi:


240

Właśnie znalazłem jeden sposób, używając biblioteki fs . Nie jestem jednak pewien, czy to najczystsze.

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


fs.readFile('./index.html', function (err, html) {
    if (err) {
        throw err; 
    }       
    http.createServer(function(request, response) {  
        response.writeHeader(200, {"Content-Type": "text/html"});  
        response.write(html);  
        response.end();  
    }).listen(8000);
});

Podstawową koncepcją jest po prostu czytanie nieprzetworzonych plików i zrzut zawartości. Nadal otwarte na czystsze opcje!


14
powinieneś użyć fs.readFileSync w twoim przypadku, byłoby źle, gdyby strona wyglądała jak niezdefiniowana. Ale tak, to dobry sposób na stworzenie podstawowego serwera HTML
generalhenry

1
sys = require('util')nie jest potrzebne, ponieważ nic nie jest drukowane na konsoli.
Bakudan

1
Odczytuje to cały plik do pamięci i na każde żądanie. Naprawdę powinieneś przesyłać strumieniowo plik z dysku zamiast buforować go. Istnieją biblioteki dobrej jakości do tego rodzaju rzeczy, takie jak senchalabs.org/connect i github.com/cloudhead/node-static
Drew Noakes

6
Myślę, że powinno to być writeHead (...), a nie writeHeader (...) ... Node.js response.writeHead ()
Danny Bullis

2
@generalhenry Jeszcze lepiej, połączenie fs.readFilemoże być umieszczone wewnątrz połączenia do http.createServer, umożliwiając obsłużenie błędu. Odpowiedź Skorzystaj Szczepana z if (err) { console.log('something bad'); return res.end('Oops! Something bad happened.');}The returnoświadczenie jest prosta sprawa, że nowi użytkownicy mogą przeoczyć.
eenblam

47

użyj app.get, aby uzyskać plik HTML. To proste!!

const express = require('express');
const app = new express();

app.get('/', function(request, response){
    response.sendFile('absolutePathToYour/htmlPage.html');
});

to takie proste. W tym celu użyj modułu ekspresowego. Zainstaluj ekspresowe:npm install express -g


35
Zapomniałeś wspomnieć, że musisz mieć express.
wrzask

7
ekspresowy przestarzały res.sendfile: zamiast tego użyj res.sendFile stackoverflow.com/a/26079640/3166417
itzhar

1
Dobre odpowiedzi Dla tych, którzy nie wiedzą, jak używać ekspresowego, wpisz to przed app.get ....:var express = require('express'); var app = express();
Eugenijus S.,

2
użyte npm install express --savezamiast -g
MrWater

39

Pliki można echo ręcznie przy użyciu obiektu fs, ale zalecam użycie frameworka ExpressJS , aby znacznie ułatwić sobie życie.

... Ale jeśli nalegasz na robienie tego w trudny sposób:

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

http.createServer(function(req, res){
    fs.readFile('test.html',function (err, data){
        res.writeHead(200, {'Content-Type': 'text/html','Content-Length':data.length});
        res.write(data);
        res.end();
    });
}).listen(8000);

7
Tak, to mniej więcej ta sama rzecz, którą popełniam. Dziękuję również za sugestię Express. Jest całkiem słodki i jestem pewien, że użyję go do następnego projektu. Moim celem było trochę dowiedzieć się, jak to się robi pod maską, zanim pozwolę ramie wykonać dla mnie ciężkie podnoszenie.
David Granado,

1
zaporę antywirusową można wyłączyć ten ruch
Mohammad Farahani

22

Wiem, że to stare pytanie, ale ponieważ nikt o nim nie wspominał, pomyślałem, że warto dodać:

Jeśli dosłownie chcesz podawać zawartość statyczną (powiedzmy o stronie „about”, obrazie, css itp.), Możesz użyć jednego z modułów wyświetlających zawartość statyczną, na przykład static-node. (Są inne, które mogą być lepsze / gorsze - spróbuj search.npmjs.org.) Przy odrobinie wstępnego przetwarzania możesz następnie odfiltrować strony dynamiczne od statycznych i wysłać je do właściwej procedury obsługi żądań.


1
Odpowiedź nie ładuje poprawnie pliku js, użycie static-node rozwiązuje mój problem.
AZ.

19

Prawdopodobnie byłoby to coś lepszego, ponieważ będziesz przesyłać strumieniowo pliki, zamiast ładować je do pamięci, np. Fs.readFile.

var http = require('http');
var fs = require('fs');
var path = require('path');
var ext = /[\w\d_-]+\.[\w\d]+$/;

http.createServer(function(req, res){
    if (req.url === '/') {
        res.writeHead(200, {'Content-Type': 'text/html'});
        fs.createReadStream('index.html').pipe(res);
    } else if (ext.test(req.url)) {
        fs.exists(path.join(__dirname, req.url), function (exists) {
            if (exists) {
                res.writeHead(200, {'Content-Type': 'text/html'});
                fs.createReadStream('index.html').pipe(res);
            } else {
                res.writeHead(404, {'Content-Type': 'text/html'});
                fs.createReadStream('404.html').pipe(res);
        });
    } else {
        //  add a RESTful service
    }
}).listen(8000);

14

To aktualizacja odpowiedzi Muhammeda Neswine'a

W Express 4.x, sendfile został uznany za przestarzały i należy użyć funkcji sendFile . Różnica polega na tym, że sendfile przyjmuje ścieżkę względną, a sendFile - ścieżkę bezwzględną. Tak więc nazwa_nazwa jest używana, aby uniknąć zakodowania ścieżki na stałe.

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

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

12

Jest to bardziej elastyczny i prosty sposób użycia pipemetody.

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

http.createServer(function(request, response) {
  response.writeHead(200, {'Content-Type': 'text/html'});

  var file = fs.createReadStream('index.html');
  file.pipe(response);

}).listen(8080);

console.log('listening on port 8080...');

10

Najlepszym sposobem, jaki nauczyłem się, jest używanie ekspresu z plikami HTML, ponieważ express daje wiele korzyści. Możesz także rozszerzyć go na platformę Heroku, jeśli chcesz .. Tylko mówię :)

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



console.log("Running at Port 3000");

Czyste i najlepsze .. !!!


6

Najłatwiejszym sposobem jest umieszczenie wszystkich plików, w tym index.html lub czegoś ze wszystkimi zasobami, takimi jak CSS, JS itp., W publicznym folderze lub możesz nadać mu dowolną nazwę, a teraz możesz użyć ekspresowego js i po prostu powiedzieć aplikacji aby użyć _dirname jako:

Dodaj je w server.js za pomocą ekspresu

var express = require('express');
var app = express();
app.use(express.static(__dirname + '/public'));

a jeśli chcesz mieć oddzielny katalog, dodaj nowy katalog do katalogu publicznego i użyj tej ścieżki „/ public / YourDirName”

Więc co dokładnie tutaj robimy? tworzymy ekspresową instancję o nazwie app i podajemy adres, jeśli katalog publiczny ma dostęp do wszystkich zasobów. Mam nadzieję że to pomoże !


6

Co powiesz na użycie modułu ekspresowego?

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

    app.get('/',function(request,response){
       response.sendFile(__dirname+'/XXX.html');
    });

    app.listen('8000');

następnie możesz użyć przeglądarki, aby uzyskać / localhost: 8000


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

  http.createServer(function(request, response) {  
    response.writeHeader(200, {"Content-Type": "text/html"});  
    var readSream = fs.createReadStream('index.html','utf8')
    readSream.pipe(response);
  }).listen(3000);

 console.log("server is running on port number ");

2
Nie sądzę, że tak response.writeHeader(), ale raczej response.writeHead().
edwin,

response.writeHeader()i response.writeHead()oba są ważne.
Deke

4

Myślę, że byłaby to lepsza opcja, ponieważ pokazuje URL prowadzący serwer:

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

const hostname = '<your_machine_IP>';
const port = 3000;

const html=fs.readFile('./index.html', function (err, html) {
    if (err) {
        throw err; 
    }
        http.createServer(function(request, response) {  
        response.writeHeader(200, {"Content-Type": "text/html"});  
        response.write(html);  
        response.end();  
    }).listen(port, hostname, () => {
            console.log(`Server running at http://${hostname}:${port}/`);
        })
}); 

4

Możesz także użyć tego fragmentu:

var app = require("express");
app.get('/', function(req,res){
   res.sendFile(__dirname+'./dir/yourfile.html')
});
app.listen(3000);

4

To jest naprawdę bardzo proste, jeśli używasz fajki. Poniżej znajduje się fragment kodu server.js.

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

function onRequest(req, res){

    console.log("USER MADE A REQUEST. " +req.url);
    res.writeHead(200, {'Content-Type': 'text/html'});
    var readStream = fs.createReadStream(__dirname + '/index.html','utf8'); 
    
/*include your html file and directory name instead of <<__dirname + '/index.html'>>*/

    readStream.pipe(res);

}

http.createServer(onRequest).listen(7000);
console.log('Web Server is running...');


W przypadku, gdy ktoś spróbuje rozszerzyć tę funkcję na zwracanie dowolnych plików w dowolnych zagnieżdżonych katalogach, upewnij się, że sprawdziłeś, że katalog, który przekazałeś użytkownikowi, nie zawiera takich rzeczy ../. Gdyby nie robić nic oprócz zmiany __dirname + "/index.html'na coś podobnego __dirname + requestedPageFromHeader, wierzę, że wynikowy kod miałby tę podatność. Znaki ścieżki katalogowej, takie jak, ~będą w porządku, pod warunkiem, że podasz __dirname +- jeśli użytkownik może określić początek ścieżki, będzie musiał również je sprawdzić.
Jon

2

Wiem, że to stare pytanie - oto proste narzędzie serwera plików, jeśli wolisz nie używać połączenia lub ekspresu; ale raczej moduł http.

var fileServer = require('./fileServer');
var http = require('http');
http.createServer(function(req, res) {
   var file = __dirname + req.url;
   if(req.url === '/') {
       // serve index.html on root 
       file = __dirname + 'index.html'
   }
   // serve all other files echoed by index.html e.g. style.css
   // callback is optional
   fileServer(file, req, res, callback);

})
module.exports = function(file, req, res, callback) {
    var fs = require('fs')
        , ext = require('path').extname(file)
        , type = ''
        , fileExtensions = {
            'html':'text/html',
            'css':'text/css',
            'js':'text/javascript',
            'json':'application/json',
            'png':'image/png',
            'jpg':'image/jpg',
            'wav':'audio/wav'
        }
    console.log('req    '+req.url)
    for(var i in fileExtensions) {
       if(ext === i) {    
          type = fileExtensions[i]
          break
       }
    }
    fs.exists(file, function(exists) {
       if(exists) {
          res.writeHead(200, { 'Content-Type': type })
          fs.createReadStream(file).pipe(res)
          console.log('served  '+req.url)
          if(callback !== undefined) callback()
       } else {
          console.log(file,'file dne')
         }  
    })
}

2

użyj ejs zamiast jadeitu

npm install ejs

app.js

app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');

./routes/index.js

exports.index = function(req, res){
res.render('index', { title: 'ejs' });};

1

To dość stare pytanie ... ale jeśli twoim przykładem użycia jest po prostu wysłanie konkretnej strony HTML do przeglądarki ad hoc, użyłbym czegoś takiego:

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

var server = http.createServer(function(req, res){
  var stream = fs.createReadStream('test.html');
  stream.pipe(res);
});
server.listen(7000);

0

możemy załadować dokument HTML z ramką Connect. Umieściłem dokument HTML i powiązane obrazy w folderze publicznym mojego projektu, w którym znajdują się poniższe kody i moduły węzłów.

//server.js
var http=require('http');
var connect=require('connect');

var app = connect()
  .use(connect.logger('dev'))
  .use(connect.static('public'))
  .use(function(req, res){
   res.end('hello world\n');
 })

http.createServer(app).listen(3000);

Próbowałem metody readFile () fs, ale ładowanie obrazów nie powiedzie się, dlatego użyłem frameworka Connect.


0

https://gist.github.com/xgqfrms-GitHub/7697d5975bdffe8d474ac19ef906e906

Oto moje proste kody demonstracyjne do hostowania statycznych plików HTML za pomocą serwera Express!

mam nadzieję, że ci to pomoże!

// simple express server for HTML pages!
// ES6 style

const express = require('express');
const fs = require('fs');
const hostname = '127.0.0.1';
const port = 3000;
const app = express();

let cache = [];// Array is OK!
cache[0] = fs.readFileSync( __dirname + '/index.html');
cache[1] = fs.readFileSync( __dirname + '/views/testview.html');

app.get('/', (req, res) => {
    res.setHeader('Content-Type', 'text/html');
    res.send( cache[0] );
});

app.get('/test', (req, res) => {
    res.setHeader('Content-Type', 'text/html');
    res.send( cache[1] );
});

app.listen(port, () => {
    console.log(`
        Server is running at http://${hostname}:${port}/ 
        Server hostname ${hostname} is listening on port ${port}!
    `);
});

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.