Node.js提供HTML页面和静态内容

时间:2016-05-18 12:06:19

标签: node.js express

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返回页面吗?

3 个答案:

答案 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服务器来提供这些文件,将动态请求转发到您的节点服务器,您可能会有更好的时间。

Node.js + Nginx - What now?