表达式静态目录如何与404路由一起使用?

时间:2011-10-21 00:58:53

标签: node.js express

我有一些代码如下:

app.configure(function() {
   app.set("views", __dirname + "/views");
   app.set("view engine", "ejs");
   app.use(express.bodyParser());
   app.use(express.methodOverride());
   app.use(express.logger()); 
   app.use(app.router);
   app.use(express.static(__dirname + "/public"));
});

//Routes
app.get("/", function(req, res) {
    res.render("index.ejs", {locals: {
      title: "Welcome"
    }});
});

//Handle 404
app.get("/*", function(req, res, next) {
    next("Could not find page");
});

我遇到的问题是我无法访问/ public静态目录中的任何内容:所有内容都被404路由捕获。我错过了一些关于它应该如何工作的东西吗?

3 个答案:

答案 0 :(得分:13)

你正在做

app.use(app.router);
app.use(express.static(__dirname + "/public"));

你想做的是

app.use(express.static(__dirname + "/public"));
app.use(app.router);

由于您在app.router中捕获了所有路线,因此它必须低于其他任何路线。否则,catch all route将确实捕获所有内容,其余的中间件将被忽略。

另外,所有这样的路线都很糟糕。

答案 1 :(得分:7)

更好的解决方案是在对 app.use 的所有调用之后放置以下代码:

app.use(function(req, res) {
    res.send(404, 'Page not found');
});

或类似的功能。

执行此操作而不是使用app.get("/*", ...

答案 2 :(得分:5)

我的方式略有不同。如果查看静态文件服务器的中间件代码,它允许调用错误调用的回调函数。只有catch你需要响应对象将有用的东西发送回服务器。所以我做了以下几点:

var errMsgs = { "404": "Dang that file is missing" };
app.use(function(req, res, next){
    express.static.send(req, res, next, {
        root: __dirname + "/public",
        path: req.url,
        getOnly: true,
        callback: function(err) {
            console.log(err);
            var code = err.status || 404,
                msg = errMsgs["" + code] || "All is not right in the world";
            res.render("error", { code: code, msg: msg, layout: false});
        }
    });
});

基本上发生的事情是,如果出现错误,它会呈现我漂亮的错误页面并记录一些内容,以便我可以在某处进行调试。