在Node.js中加载基本HTML


207

我正在尝试找出如何加载和呈现基本HTML文件的方法,因此不必编写类似以下的代码:

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

Answers:


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 2011年

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可以将to的调用放在to的调用中http.createServer,从而可以处理错误。将Stephen的答案与一起使用if (err) { console.log('something bad'); return res.end('Oops! Something bad happened.');}return声明是新用户可能忽略的简单事情。
eenblam 2015年

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
尖叫

7
表示已弃用的res.sendfile:使用res.sendFile代替stackoverflow.com/a/26079640/3166417
itzhar 2016年

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等),则可以使用静态内容提供模块之一,例如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

这是穆罕默德·内斯温的答案的更新

在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并告诉app将_dirname用作:

在您的server.js中使用express添加这些

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()
edwin

response.writeHeader()response.writeHead()两者都是有效的。
德克

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

我知道这是一个老问题-如果您不想使用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')
         }  
    })
}


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()方法,但是它无法加载图像,这就是为什么我使用了connect框架。


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.