Caricamento HTML di base in Node.js


207

Sto cercando di scoprire come caricare e eseguire il rendering di un file HTML di base, quindi non devo scrivere codice come:

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

Risposte:


240

Ho appena trovato un modo usando la libreria fs . Non sono sicuro però se sia il più pulito.

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

Il concetto di base è solo la lettura di file non elaborati e il relativo dumping. Ancora aperto a opzioni più pulite, però!


14
dovresti usare fs.readFileSync nel tuo caso, sarebbe male per la pagina apparire come indefinita. Ma sì, è un buon modo per creare un server html di base
generalhenry,

1
sys = require('util')non è necessario poiché non viene stampato nulla sulla console.
Bakudan,

1
Questo legge l'intero file in memoria e su ogni richiesta. Dovresti davvero eseguire lo streaming del file dal disco anziché memorizzarlo nel buffer. Esistono librerie di buona qualità per questo genere di cose, come senchalabs.org/connect e github.com/cloudhead/node-static
Drew Noakes,

6
Penso che dovrebbe essere writeHead (...) non writeHeader (...) ... Node.js response.writeHead ()
Danny Bullis,

2
@generalhenry Meglio ancora, la chiamata a fs.readFilepotrebbe essere inserita all'interno della chiamata a http.createServer, consentendo di gestire l'errore. Usa la risposta di Stephen con if (err) { console.log('something bad'); return res.end('Oops! Something bad happened.');}L' returnaffermazione è la cosa semplice che i nuovi utenti potrebbero trascurare.
eenblam,

47

usa app.get per ottenere il file html. è semplice!!

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

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

E 'così semplice. Per questo utilizzare il modulo express. Installa express:npm install express -g


36
Hai dimenticato di dire che devi avere express.
strilla il

7
esprimere res.sendfile deprecato: Usa res.sendFile invece stackoverflow.com/a/26079640/3166417
itzhar

1
Buone risposte. Per coloro che non sanno come usare express digitare questo prima di app.get ....:var express = require('express'); var app = express();
Eugenijus S.

2
usato al npm install express --saveposto di -g
MrWater

39

Puoi fare l'eco manuale dei file usando l'oggetto fs, ma ti consiglio di usare il framework ExpressJS per semplificarti la vita.

... Ma se insisti a farlo nel modo più duro:

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
Sì, è più o meno la stessa cosa con cui mi metto. Grazie anche per il suggerimento Express. È piuttosto dolce e sono abbastanza sicuro che lo userò per il mio prossimo progetto. Il mio obiettivo era quello di capire come è fatto sotto il cofano prima di lasciare che il telaio facesse il pesante sollevamento per me.
David Granado,

1
firewall di antivirus può essere disattivato questa mossa
Mohammad Farahani

22

So che questa è una vecchia domanda, ma dato che nessuno l'ha menzionato, ho pensato che valesse la pena aggiungere:

Se vuoi letteralmente servire contenuto statico (ad esempio una pagina "about", un'immagine, css, ecc.) Puoi usare uno dei moduli che servono contenuto statico, ad esempio nodo-statico. (Ce ne sono altri che potrebbero essere migliori / peggiori: prova a search.npmjs.org.) Con un po 'di pre-elaborazione puoi quindi filtrare le pagine dinamiche da statiche e inviarle al giusto gestore di richieste.


1
La risposta non carica correttamente il file js, usando node-static risolve il mio problema.
AZ.

19

Questo sarebbe probabilmente qualcosa di meglio dato che eseguirai lo streaming dei file piuttosto che caricarli tutti in memoria come 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

Questo è un aggiornamento alla risposta di Muhammed Neswine

In Express 4.x, sendfile è stato deprecato e deve essere utilizzata la funzione sendFile . La differenza è che sendfile prende il percorso relativo e sendFile prende il percorso assoluto. Quindi, __dirname viene utilizzato per evitare l'hardcoding del percorso.

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

È un modo più flessibile e semplice di usare il pipemetodo.

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

Il modo migliore che ho imparato è usare express con file html poiché express offre molti vantaggi. Inoltre, puoi estenderlo a una piattaforma Heroku, se vuoi ... Basta dire :)

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

Pulito e migliore .. !!!


6

Il modo più semplice per farlo è mettere tutti i tuoi file tra cui index.html o qualcosa con tutte le risorse come CSS, JS ecc. In una cartella pubblica o puoi nominarlo come vuoi e ora puoi usare express js e dire semplicemente all'app per usare il _dirname come:

Nel tuo server.js usando express aggiungi questi

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

e se vuoi avere una directory separata aggiungi una nuova directory nella directory pubblica e usa quel percorso "/ public / YourDirName"

Quindi cosa stiamo facendo esattamente qui? stiamo creando un'istanza espressa chiamata app e stiamo fornendo l'indirizzo se la directory pubblica accede a tutte le risorse. Spero che questo ti aiuti !


6

Che ne dici di usare il modulo express?

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

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

    app.listen('8000');

quindi, è possibile utilizzare il browser per ottenere / 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
Non penso che sia response.writeHeader(), ma piuttosto response.writeHead().
edwin,

response.writeHeader()ed response.writeHead()entrambi sono validi.
Deke

4

Penso che questa sarebbe un'opzione migliore in quanto mostra l'URL che esegue il server:

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

Puoi anche utilizzare questo frammento:

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

4

È davvero molto semplice se usi pipe. Di seguito è riportato lo snippet di codice 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...');


Nel caso in cui qualcuno cerchi di estenderlo alla restituzione di file arbitrari in directory nidificate arbitrarie, assicurati di controllare che la directory passata dall'utente non includa cose come ../. Se non dovessi fare altro che passare __dirname + "/index.html'a qualcosa del genere __dirname + requestedPageFromHeader, credo che il codice risultante avrebbe questa vulnerabilità. I caratteri del percorso di directory come ~andranno bene finché includi il __dirname +- se l'utente può determinare l'inizio del percorso dovrà verificare anche questi.
Jon

2

So che questa è una vecchia domanda: ecco una semplice utility per file server se preferisci non usare connect o express; ma piuttosto il modulo 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

usa ejs invece di giada

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

Questa è una domanda piuttosto vecchia ... ma se il tuo caso d'uso è semplicemente quello di inviare una determinata pagina HTML al browser su una base ad hoc, userei qualcosa di semplice come questo:

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

possiamo caricare il documento html con il lavoro del frame connect. Ho inserito il mio documento html e le immagini correlate nella cartella pubblica del mio progetto in cui sono presenti i seguenti moduli codice e nodo.

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

Ho provato il metodo readFile () di fs, ma non riesce a caricare le immagini, ecco perché ho usato il framework di connessione.


0

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

Ecco i miei semplici codici demo per i file HTML statici host utilizzando Express Server!

spero che ti aiuti!

// 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}!
    `);
});

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.