Загрузка базового HTML в Node.js

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')не требуется, поскольку на консоль ничего не выводится.
Бакудан
1
Это читает весь файл в память и при каждом запросе. Вы действительно должны передавать файл с диска, а не буферизировать его. Для такого рода вещей существуют библиотеки хорошего качества, такие как senchalabs.org/connect и github.com/cloudhead/node-static
Дрю Ноакс
6
Я думаю, что это должно быть writeHead (...), а не writeHeader (...) ... Node.js response.writeHead ()
Дэнни Буллис
2
@generalhenry Еще лучше, чтобы вызов fs.readFileмог быть помещен в вызов http.createServer, позволяя обработать ошибку. Ответ Используйте Стефан с if (err) { console.log('something bad'); return res.end('Oops! Something bad happened.');}The 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

Мухаммед Несвин
источник
36
Вы забыли упомянуть, что вы должны иметь express.
Визг
7
экспресс-устаревший файл res.sendfile: используйте res.sendFile вместо stackoverflow.com/a/26079640/3166417
ижар
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
Да, это примерно то же самое, что и я. Спасибо за предложение Экспресс тоже. Это довольно мило, и я уверен, что буду использовать его для моего следующего проекта. Моей целью было выяснить, как это делается под капотом, прежде чем я позволю каркасу сделать тяжелую работу за меня.
Дэвид Гранадо
1
брандмауэр антивируса можно отключить этим ходом
Мохаммад Фарахани
22

Я знаю, что это старый вопрос, но, поскольку никто не упомянул об этом, я подумал, что стоит добавить:

Если вы буквально хотите обслуживать статический контент (например, страницу about, image, css и т. Д.), Вы можете использовать один из модулей обслуживания статического контента, например, node-static. (Есть и другие, которые могут быть лучше / хуже - попробуйте search.npmjs.org.) С небольшой предварительной обработкой вы можете отфильтровать динамические страницы из статических и отправить их нужному обработчику запросов.

Павел
источник
1
Ответ не загружает файл js правильно, использование нод-статики решает мою проблему.
А-Я.
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);
user2428926
источник
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'));
});
Мит Мехта
источник
13

Это более гибкий и простой способ использования 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...');
Devsullo
источник
10

Лучший способ, которым я научился, - это использовать экспресс с HTML-файлами, так как экспресс дает много преимуществ. Кроме того, вы можете расширить его до платформы 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 и просто сообщить app использовать _dirname как:

В ваш server.js используя экспресс добавить эти

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

и если вы хотите иметь отдельный каталог, добавьте новый каталог в публичный каталог и используйте этот путь "/ public / YourDirName"

ТАК что мы тут делаем? мы создаем экспресс-экземпляр с именем app и даем адрес, если публичный каталог для доступа ко всем ресурсам. Надеюсь это поможет !

Муааз Салагар
источник
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
5

Это просто очень просто, если вы используете трубу. Ниже приведен фрагмент кода 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...');

Abrar_11648
источник
В случае, если кто-то попытается распространить это на возврат произвольных файлов в произвольных вложенных каталогах, убедитесь, что вы проверили, что каталог, который передал ваш пользователь, не содержит таких вещей, как ../. Если бы я ничего не делал, кроме как изменился __dirname + "/index.html'на что-то вроде __dirname + requestedPageFromHeader, я считаю, что полученный код имел бы эту уязвимость. Символы пути к каталогу, такие как, ~будут в порядке, если вы включите __dirname +- если пользователь может определить начало пути, нужно будет также проверить их.
Джон
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}/`);
        })
}); 
sghazagh
источник
4

Вы также можете использовать этот фрагмент:

var app = require("express");
app.get('/', function(req,res){
   res.sendFile(__dirname+'./dir/yourfile.html')
});
app.listen(3000);
heyTanay
источник
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')
         }  
    })
}
user548
источник
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);
granmoe
источник
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);

Я пробовал метод readFile () для fs, но он не загружает изображения, поэтому я использовал платформу подключения.

Балайесу Чилакалапуди
источник
0

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

Вот мои простые демонстрационные коды для размещения статических файлов HTML с использованием сервера Express!

надеюсь, это поможет вам!

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

xgqfrms
источник