Node.jsでの基本的なHTMLの読み込み


207

基本的なHTMLファイルをロードしてレンダリングする方法を見つけようとしているので、次のようなコードを記述する必要はありません。

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

回答:


240

私はfsライブラリを使用して1つの方法を見つけました。それが一番きれいかどうかはわかりません。

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

基本的なコンセプトは、生のファイルを読み取って内容をダンプすることです。ただし、よりクリーンなオプションを利用できます。


14
あなたのケースではfs.readFileSyncを使用する必要があります。ページが未定義として表示されるのは好ましくありません。しかし、はい、それは基本的なhtmlサーバーを作成する良い方法です
Generalhenry

1
sys = require('util')コンソールには何も出力されないため、必要ありません。
爆弾

1
これにより、ファイル全体がメモリに読み込まれ、リクエストごとに読み込まれます。実際には、ファイルをバッファリングするのではなく、ディスクからストリーミングする必要があります。この種のものには、senchalabs.org / connect
Drew Noakes

6
私はそれがwriteHeader(...)ではなくwriteHead(...)であるべきだと思います... Node.js response.writeHead()
Danny Bullis

2
@generalhenryさらに良いことに、fs.readFileへの呼び出しをへの呼び出し内に配置してhttp.createServer、エラーを処理することができます。使用スティーブンの答えの文では、新規ユーザーが見落とすかもしれないという単純なことです。if (err) { console.log('something bad'); return res.end('Oops! Something bad happened.');}return
eenblam

47

app.getを使用してHTMLファイルを取得します。それは簡単です!!

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

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

それと同じくらい簡単です。これにはExpressモジュールを使用します。Expressをインストールします。npm install express -g


35
あなたが持っている必要があることを言及するのを忘れましたexpress
2015年

7
代わりに使用res.sendFile:非推奨res.sendfileを表現stackoverflow.com/a/26079640/3166417
itzhar

1
良い答え。app.get ....の前にこれをエクスプレスタイプで使用する方法を知らない人のために:var express = require('express'); var app = express();
Eugenijus S.

2
npm install express --save-gの代わりに使用
MrWater

39

fsオブジェクトを使用して手動でファイルをエコーできますが、ExpressJSフレームワークを使用して作業をはるかに簡単にすることをお勧めします。

...しかし、あなたがそれを難し​​い方法で行うと主張した場合:

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
ええ、それは私が思いついたのと大体同じです。Expressの提案もありがとうございます。とても甘いですし、次のプロジェクトで使うことになると確信しています。私の目標は、フレームワークに重い仕事を任せる前に、それが内部でどのように行われるかを理解することでした。
David Granado

1
アンチウイルスのファイアウォールはこの動きを無効にすることができます
Mohammad Farahani

22

これは古い質問であることは知っていますが、誰も言及していないので、追加する価値があると思いました。

文字通り静的コンテンツ(「概要」ページ、画像、CSSなど)を提供したい場合は、静的ノードの静的モジュールの1つを使用できます。(より良い/悪いかもしれない他のものがあります-search.npmjs.orgを試してください。)少し前処理することで、静的なページから動的なページをフィルタリングし、適切なリクエストハンドラーに送信できます。


1
答えはjsファイルを正しくロードしません、node-staticを使用すると問題が解決します。
AZ。

19

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

これは、ムハンマドネスワインの回答の更新です

Express 4.xでは、sendfileは非推奨になり、sendFile関数を使用する必要があります。違いは、sendfileが相対パスを使用し、sendFileが絶対パスを使用することです。したがって、__ dirnameはパスのハードコーディングを回避するために使用されます。

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

これは、pipeメソッドを使用するより柔軟で簡単な方法です。

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

私が学んだ最良の方法は、Expressが多くの利点をもたらすため、HTMLファイルでExpressを使用することです。また、必要に応じて、Herokuプラットフォームに拡張することもできます。

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

清潔で最高.. !!!


6

簡単な方法は、index.htmlを含むすべてのファイル、またはCSS、JSなどのすべてのリソースを備えた何かをパブリックフォルダーに配置するか、好きな名前を付けて、エクスプレスjsを使用してアプリに伝えるだけです_dirnameを次のように使用するには:

エクスプレスを使用してserver.jsにこれらを追加します

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

別のディレクトリにしたい場合は、パブリックディレクトリの下に新しいディレクトリを追加し、そのパスを使用します "/ public / YourDirName"

だから私たちはここで正確に何をしていますか?appという名前のExpressインスタンスを作成し、パブリックディレクトリがすべてのリソースにアクセスするかどうかを指定します。お役に立てれば !


6

高速モジュールを使用するのはどうですか?

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

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

    app.listen('8000');

次に、ブラウザを使用して/ 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
そうだとは思わないresponse.writeHeader()が、むしろresponse.writeHead()
エドウィン

response.writeHeader()response.writeHead()両方が有効です。
Deke、

4

サーバーを実行しているURLが表示されるので、これはより良いオプションになると思います。

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

このスニペットを使用することもできます:

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

4

パイプを使用すれば、それは本当に簡単です。以下は、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...');


誰かがこれを拡張して任意のネストされたディレクトリ内の任意のファイルを返すようにしようとした場合は、ユーザーが渡したディレクトリになどのものが含まれていないことを確認してください../。の__dirname + "/index.html'ようなものに変更する以外は何もしなかった場合__dirname + requestedPageFromHeader、結果のコードにはこの脆弱性があると思います。などのディレクトリパス文字~は、__dirname +- を含める限り問題ありません。ユーザーがパスの開始を判別できる場合は、これらもチェックする必要があります。
ジョン

2

私はこれが古い質問であることを知っています-接続またはエクスプレスを使用したくない場合は、ここに簡単なファイルサーバーユーティリティがあります。むしろ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

ヒスイの代わりにejsを使用する

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

これはかなり古い質問です...しかし、ここでのユースケースが特定のHTMLページをその場限りでブラウザに送信する場合は、次のような簡単なものを使用します。

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ドキュメントをロードできます。私のhtmlドキュメントと関連画像を、以下のコードとノードモジュールが存在するプロジェクトのパブリックフォルダーに配置しました。

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

fsのreadFile()メソッドを試しましたが、イメージのロードに失敗しました。そのため、接続フレームワークを使用しました。


0

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

Expressサーバーを使用して静的なHTMLファイルをホストするための簡単なデモコードを次に示します。

それがあなたのために役立つことを願っています!

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.