Node.js에서 기본 HTML로드


207

기본 HTML 파일을로드하고 렌더링하는 방법을 찾으려고하므로 다음과 같은 코드를 작성할 필요가 없습니다.

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

답변:


240

fs 라이브러리를 사용하여 한 가지 방법을 찾았습니다 . 그것이 가장 깨끗한 지 확실하지 않습니다.

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')콘솔에 아무것도 인쇄되지 않으므로 필요하지 않습니다.
Bakudan

1
이것은 전체 파일을 메모리와 모든 요청에서 읽습니다. 실제로 파일을 버퍼링하지 않고 디스크에서 파일을 스트리밍해야합니다. senchalabs.org/connectgithub.com/cloudhead/node-static
Drew Noakes

6
나는 그것이 writeHead (...)가 아니라고 생각한다. writeHeader (...) ... 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');
});

그것만큼 간단합니다. 이를 위해 고속 모듈을 사용하십시오. 특급 설치 :npm install express -g


35
당신은 당신이 가지고 있다고 언급하는 것을 잊었다 express.
shriek

7
더 이상 사용되지 않는 res.sendfile을 표현하십시오. 대신 res.sendFile을 사용하십시오. stackoverflow.com/a/26079640/3166417
itzhar

1
좋은 답변입니다. app.get .... 전에 Express 유형을 사용하는 방법을 모르는 사람들을 위해 :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
안티 바이러스의 방화벽 이이 이동을 비활성화 할 수 있습니다
모하마드 Farahani

22

나는 이것이 오래된 질문이라는 것을 알고 있지만 아무도 언급하지 않았으므로 추가 할 가치가 있다고 생각했습니다.

문자 그대로 정적 컨텐츠 (예 : '정보'페이지, 이미지, CSS 등)를 제공하려는 경우 정적 컨텐츠 제공 모듈 중 하나 (예 : node-static)를 사용할 수 있습니다. (나을 수도 있고 나쁠 수도 있습니다. 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

이것은 Muhammed Neswine의 답변에 대한 업데이트입니다.

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 등과 같은 모든 리소스가있는 폴더를 공용 폴더에 넣거나 원하는 이름을 지정할 수 있으며 express js를 사용하고 응용 프로그램에 알려주는 것입니다 _dirname을 다음과 같이 사용하십시오.

express를 사용하여 server.js에 다음을 추가하십시오.

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

seprate 디렉토리를 사용하려면 공용 디렉토리 아래에 새 디렉토리를 추가하고 해당 경로 "/ 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().
edwin

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 +- 사용자가 아니라이 있는지 확인해야합니다 경로의 시작을 확인할 수있는 경우.
Jon

2

나는 이것이 오래된 질문이라는 것을 알고 있습니다. connect 또는 express를 사용하지 않으려는 경우 간단한 파일 서버 유틸리티가 있습니다. 오히려 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.