Node.js'de temel HTML yükleniyor


207

Nasıl yüklemek ve böyle bir kod yazmak zorunda değilsiniz nasıl temel bir HTML dosyası render öğrenmek için çalışıyorum:

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

Yanıtlar:


240

Ben sadece fs kütüphanesini kullanarak bir yol buldum . Yine de en temiz olup olmadığından emin değilim.

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

Temel kavram sadece ham dosya okuma ve içeriği boşaltma. Yine de daha temiz seçeneklere açık!


14
sizin durumunuzda fs.readFileSync kullanmalısınız, sayfanın tanımsız olarak gelmesi kötü olur. Ama evet, bu temel bir html sunucusu yapmak için iyi bir yoldur
generalhenry

1
sys = require('util')konsola hiçbir şey yazdırılmadığından gerekli değildir.
Bakudan

1
Bu, tüm dosyayı belleğe ve her istek üzerine okur. Dosyayı arabelleğe almak yerine diskten gerçek zamanlı aktarmalısınız. Bu tür şeyler için kaliteli kütüphaneler mevcuttur, örneğin senchalabs.org/connect ve github.com/cloudhead/node-static
Drew Noakes

6
Bunun olması gerektiğini düşünüyorum writeHead (...) değil writeHeader (...) ... node.js response.writeHead ()
Danny Bullis

2
@generalhenry Daha da iyisi, çağrının fs.readFileiçine çağrı yapılarak http.createServerhatanın işlenmesine izin verilebilir. İle kullan Stephen cevabı açıklamada, yeni kullanıcıların ardı olabileceğini basit bir şeydir. if (err) { console.log('something bad'); return res.end('Oops! Something bad happened.');}return
eenblam

47

html dosyasını almak için app.get kullanın. basit!!

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

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

bu kadar basit. Bunun için ekspres modül kullanın. Ekspres yükleyin:npm install express -g


35
Sahip olman gerektiğini söylemeyi unuttun express.
shriek

7
kullanımdan kaldırılmış res.sendfile yazın: bunun yerine res.sendFile kullanın stackoverflow.com/a/26079640/3166417
itzhar

1
Güzel cevaplar. Ekspres nasıl kullanılacağını bilmeyenler için app.get önce bunu yazın ....:var express = require('express'); var app = express();
Eugenijus S.

2
npm install express --save-g yerine kullanılır
MrWater

39

Dosyaları fs nesnesini kullanarak el ile yansıtabilirsiniz, ancak hayatınızı daha kolay hale getirmek için ExpressJS çerçevesini kullanmanızı tavsiye ederim .

... Ama zor yoldan yapmakta ısrar ediyorsanız:

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
Evet, kabaca aynı şey. Express önerisi için de teşekkürler. Çok tatlı ve eminim ki bir sonraki projem için kullanacağım. Amacım, çerçevenin benim için ağır kaldırmayı yapmasına izin vermeden önce kaputun altında nasıl yapıldığını bulmaktı.
David Granado

1
virüsünün güvenlik duvarı bu hareketi devre dışı bırakabilir
Mohammad Farahani

22

Bu eski bir soru olduğunu biliyorum, ama kimse belirtmediği gibi eklemeye değer olduğunu düşündüm:

Kelimenin tam anlamıyla statik içerik sunmak istiyorsanız ('hakkında' sayfa, resim, css vb.), Statik içerik sunma modüllerinden birini, örneğin düğüm statikini kullanabilirsiniz. (Daha iyi / kötü olabilecek başkaları da vardır - search.npmjs.org'u deneyin.) Biraz ön işleme ile dinamik sayfaları statikten filtreleyebilir ve doğru istek işleyicisine gönderebilirsiniz.


1
Yanıt js dosyasını doğru yüklemiyor, düğüm statik kullanarak sorunumu çözüyor.
AZ.

19

Bu, muhtemelen fs.readFile gibi belleğe yüklemek yerine dosya (lar) akışını gerçekleştireceğinizden daha iyi olacaktır.

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

Bu Muhammed Neswine cevabının bir güncellemesi

Express 4.x sürümünde sendfile kullanımdan kaldırıldı ve sendFile işlevi kullanılmalıdır. Fark sendfile göreceli yol alır ve sendFile mutlak yol alır. Bu nedenle, __dirname yolu kodlamayı önlemek için kullanılır.

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

Bu pipeyöntemi kullanmanın daha esnek ve basit bir yoludur .

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

Ben öğrendim en iyi yolu express html dosyaları ile express kullanarak çok avantaj sağlar. Ayrıca isterseniz bir Heroku platformuna genişletebilirsiniz ...

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

Temiz ve en iyi .. !!!


6

Bunu yapmanın kolay yolu, index.html veya CSS, JS vb.Gibi tüm kaynaklara sahip bir dosyayı herkese açık bir klasöre koymak veya istediğiniz her şeyi adlandırabilir ve şimdi ekspres js'yi kullanabilir ve sadece uygulamaya söyleyebilirsiniz. _dirname'i şu şekilde kullanmak için:

Server.js dosyasında ekspres kullanarak bunları ekleyin

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

ve eğer ayrı bir dizinin genel dizin altına yeni dizin ekleyip "/ public / YourDirName" yolunu kullanabilirsiniz.

Peki burada tam olarak ne yapıyoruz? app adında express örneği oluşturuyoruz ve genel dizinin tüm kaynaklara erişmesi için adres veriyoruz. Bu yardımcı olur umarım !


6

Express modülünü kullanmaya ne dersiniz?

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

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

    app.listen('8000');

daha sonra / localhost almak için tarayıcıyı kullanabilirsiniz: 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
Bence response.writeHeader()değil, aksine response.writeHead().
edwin

response.writeHeader()ve response.writeHead()ikisi de geçerlidir.
Deke

4

Ben sunucuyu çalıştıran URL gösterir gibi bu daha iyi bir seçenek olacağını düşünüyorum:

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

Bu snippet'i de kullanabilirsiniz:

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

4

Boru kullanırsanız gerçekten çok basit. Server.js kod snippet'i aşağıdadır.

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


Herhangi birinin bunu rasgele iç içe dizinlerde rasgele dosyaları döndürmek için genişletmeye çalışması durumunda, kullanıcının geçtiği dizinde benzer şeyler bulunmadığından emin olun ../. Böyle bir şeyden başka bir __dirname + "/index.html'şey __dirname + requestedPageFromHeaderyapmasaydı, sonuçta ortaya çıkan kodun bu güvenlik açığına sahip olacağına inanıyorum. Gibi dizin yolu karakterleri ~sürece sürece iyi olacaktır __dirname +- eğer kullanıcı yolun başlangıcını belirleyebiliyorsa, bunları da kontrol etmeniz gerekecektir.
Jon

2

Bu eski bir soru olduğunu biliyorum - burada connect veya express kullanmayı tercih ederseniz basit bir dosya sunucusu yardımcı programıdır; daha ziyade http modülü.

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

yeşim yerine ejs kullan

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

Bu oldukça eski bir soru ... ama buradaki kullanım durumunuz tarayıcıya geçici olarak belirli bir HTML sayfası göndermekse, böyle basit bir şey kullanırdım:

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

html belgesini bağlantı çerçevesi çalışması ile yükleyebiliriz. Html belgemi ve ilgili görüntüleri, aşağıdaki kod ve düğüm modüllerinin bulunduğu projemin ortak klasörüne yerleştirdim.

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

Ben fs readFile () yöntemini denedim, ancak görüntüleri yüklemek için başarısız, bu yüzden bağlantı çerçevesi kullanmış.


0

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

Express sunucusu kullanarak ana bilgisayar statik HTML dosyaları için basit demo kodlarım!

Umarım sana yardımcı olur!

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.