Как экспресс-статические каталоги работают с маршрутом 404? - PullRequest
5 голосов
/ 21 октября 2011

У меня есть некоторый код, который выглядит следующим образом:

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 static: все попадает в маршрут 404.Я что-то упускаю из-за того, как это должно работать?

Ответы [ 3 ]

13 голосов
/ 21 октября 2011

Ты делаешь

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

То, что вы хотите сделать, это

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

Поскольку у вас есть маршрут на все пути в app.router, он должен быть ниже, чем все остальное. в противном случае перехват всех маршрутов действительно перехватит все, а остальная часть промежуточного программного обеспечения игнорируется.

В качестве ловли в сторону, все такие маршруты плохие.

7 голосов
/ 19 декабря 2013

Лучшим решением было бы разместить следующий код после всех вызовов app.use :

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

или аналогичной функции.

Сделайте это вместоиспользования app.get("/*", ...

5 голосов
/ 12 декабря 2011

Я делаю это немного по-другому. Если вы посмотрите на код промежуточного программного обеспечения для статического файлового сервера, он учитывает функцию обратного вызова, которая вызывается с ошибками. Единственный улов - вам нужен объект ответа, чтобы отправить что-то полезное обратно на сервер. Поэтому я делаю следующее:

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

В основном, если происходит ошибка, она отображает мою красивую страницу с ошибкой и записывает что-то, чтобы я мог где-то отладить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...