Node.js服务HTML页面和静态内容

var express = require("express"); var app = express(); var path = require("path"); app.use(express.static(__dirname + '/view')); app.get('/dashboard',function(req,res){ res.sendFile((path.join(__dirname + '/dashboard.html')); }); app.get('/index1',function(req,res){ res.sendFile((path.join(__dirname+'/index.html')); }); app.get('/',function(req,res){ res.redirect('/login'); }); app.get('/login',function(req,res){ res.redirect((path.join(__dirname + '/login')); }); app.listen(3000); console.log("Running at Port 3000"); 

我的问题是为什么我需要检查每次用户请求?

另外,如果我有我的目录中的100个HTML文件,我需要通过get方法检查每个文件,然后通过res.sendFile返回页面?

@OrangeDog和@Clemens Himmer说的都是真的。 但是,为脚本中的所有文件提供服务的最简单方法已经在您的脚本中了:

 app.use(express.static(__dirname + '/view')); 

如果名称与URL匹配,那么这将在view目录中提供所有内容,例如http://yoursite.com/index.html将parsing为位于__dirname +'/view/index.html'的文件。

但是,在您的示例路由中,您似乎正在将URLpath更改为不再与文件位置匹配(例如,要parsing为/login.html的/login )。 你当然可以编写中间件来解决这个问题,并根据一个模式来parsing文件,但是在那个时候,使用一个专门构build的web服务器(比如之前提到的nginx)具有更高的URL重写function。

不,您不必以编程方式列出所有的静态文件。 您可以通过将中间件绑定到服务器的根目录来dynamic提供它们。

这是我做的一个小的express.js脚本,它基本上是一个非常简单的Web服务器,可以提供任何东西和漂亮的HTML。

 // This servers a file.. var serveFile = function(filePath, res){ var options = { dotfiles: 'deny', headers: { 'x-timestamp': Date.now(), 'x-sent': true } }; res.sendFile(filePath, options, function (err) { if (err) { console.log(err); res.status(err.status).end(); } }); }; // Serve web files app.use("/", function (req, res, next) { var filePath = (absoluteServePath + req.originalUrl).replace(/\//g,"\\"); var checkFilePath = function(filePath){ return new Promise(function(resolve, reject) { fs.access(filePath, fs.F_OK, function(err) { if(!err){ // If FILE / DIR exists check if file or DIR if(fs.lstatSync(filePath).isDirectory() == true){ reject(); } else{ resolve(); } }else{ reject(err); } }); }); }; checkFilePath(filePath).then(function(){ serveFile(filePath,res); },function(){ // Check if path ends with a slash var endsWithSlash = filePath.substr(filePath.length - 1) == "\\"; // Check if a index.html exists in the path var indexHTMLPath = filePath + ((endsWithSlash == true) ? "" : "\\") + "index.html"; checkFilePath(indexHTMLPath).then(function(){ serveFile(indexHTMLPath,res); },function(){ // Check if .html for the path exists var plusHTMLPath = filePath +".html"; checkFilePath(plusHTMLPath).then(function(){ serveFile(plusHTMLPath,res); },function(){ // Nope, does not exist at all next(); }); }); }); }); 

我的问题是为什么我需要检查每次用户请求?

如果你不检查是什么,你应该如何给用户提供他们要求的内容?

如果我在我的目录中有100个html文件怎么办?我需要通过get方法检查每个文件,然后通过res.sendFile返回页面吗?

如果你的意思是你需要为每个文件声明一个单独的路线,那么答案是否定的。 Express路由可以基于模式,因此可以为整个目录定义路由,然后返回请求的特定文件: Node中的简单静态HTML服务器 。

然而,这一切都导致Node.JS 不是一个很好的select提供大量的静态内容 。 有很多安全和其他你需要照顾的问题,它只是没有performance得那么好。 如果您使用nginx或apache2服务器来提供这些文件,将dynamic请求转发到您的节点服务器,您可能会有更好的时间。

Node.js + Nginx – 现在什么?