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
返回页面吗?
答案 0 :(得分:4)
@OrangeDog和@Clemens Himmer说的都是真的。但是,提供目录中所有文件的最简单方法是在脚本中:
app.use(express.static(__dirname + '/view'));
如果名称与网址匹配,则会在view
目录中提供所有内容,例如: http://yoursite.com/index.html将解析为__dirname +' /view/index.html'上的文件。
但是,在您的示例路线中,您似乎正在将网址路径更改为不再与文件位置匹配(例如,您想要解析为/login
' /login.html' )。你绝对可以编写中间件来解决这个问题并根据模式解析文件,但是在这一点上使用专门构建的Web服务器(比如之前建议的nginx)要简单得多,它具有已经烘焙过的URL重写功能。
答案 1 :(得分:3)
不,您不必以编程方式列出所有静态文件。您可以通过将middleware绑定到服务器的根目录来动态地为它们提供服务。
这是我已经完成的一个小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();
});
});
});
});
答案 2 :(得分:1)
我的问题是为什么每次用户请求时都需要检查?
如果您不检查这是什么,您应该如何向用户提供他们所要求的内容?
如果我的目录中有100个html文件,我需要通过get方法检查每个文件,然后通过res.sendFile返回页面吗?
如果你的意思是你需要为每个文件声明一个单独的路由,那么答案是否定的。快速路线可以是基于模式的,因此您可以为例如路线定义路线。整个目录,然后返回请求的特定文件:Simple static HTML server in Node。
然而,这一切都导致了Node.JS not being a great choice for serving lots of static content。您需要注意许多安全性和其他问题,并且它的性能并不尽如人意。如果您使用nginx或apache2服务器来提供这些文件,将动态请求转发到您的节点服务器,您可能会有更好的时间。