#node.js #express
#node.js #экспресс
Вопрос:
Я использую Express 4, и у меня есть около 50 HTML-страниц. Я пытаюсь обработать ошибки 404, но не могу понять, как. Я не хочу вручную определять все маршрутизаторы внутри узла. Есть ли способ динамического перенаправления на шаблон 404 Jade, если страница не существует?
Я пробовал этот код, но не сработало:
app.enable('verbose errors');
app.set('port', 3000);
app.use(express.static(__dirname '/html/'));
var server = http.createServer(app);
server.listen(app.get('port'), function() {
console.log('ONLINE !');
});
app.use(function(req, res, next) {
console.log('GET ' req.originalUrl)
console.log('At %d', Date.now());
next();
});
// Handle 404
app.use(function(req, res, next) {
if(req.accepts('html') amp;amp; res.status(404)) {
res.render('404.jade');
return;
}
});
Комментарии:
1. Каким образом динамически? Вам нужно будет как-то определить маршрут, будь то с помощью маршрутизатора,
app.use
,app.error
или промежуточного программного обеспечения и т.д.? Все ваши файлы статичны, у вас, похоже, нет никаких маршрутов, кроме статических, и похоже, что все ваши динамические запросы будут попадать в обработчик 404?2. Да, все они являются статическими. У меня есть несколько запросов get и post, но это для API, который я создаю на стороне. Если я настрою промежуточное программное обеспечение, все запросы заканчиваются ошибками 404.
3. Значит, даже статические файлы попадают в маршрут 404? Вы должны
listen
после определения маршрутов переместить эту строку в конец4. Как говорит @adeneo, следуйте порядку в моем ответе. У меня это работает. Спасибо
5. К сожалению, у меня это не сработало. Запросы post и get выполняются нормально, только статические файлы попадают в маршрут 404, если я отправил их, как это сделал @shansfk.
Ответ №1:
У меня это работает:
var express = require('express');
var app = express();
app.use(express.static('public'));
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.get('/employee', function (req, res) {
res.send('Employee route !!');
});
// Handle 404 - Keep this as a last route
app.use(function(req, res, next) {
res.status(404);
res.send('404: File Not Found');
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
Структура папок,
Теперь, когда мы отправляем запрос следующим образом
Это было обработано промежуточным программным обеспечением.
Обновить
Способ отображения HTML-файлов без записи запроса get — это просто еще одно промежуточное программное обеспечение, подобное этому
app.use(express.static('public'));
app.use(express.static('views'));
Добавьте промежуточное программное обеспечение ‘views’ точно после ‘public’.
Теперь, если мы дадим
Страница отрисована.
Комментарии:
1. Проблема в том, что у меня есть 50 HTML-страниц, я не хочу создавать get-запрос для всех из них. Если только мне не придется.
2. Пожалуйста, проверьте это. Это нормально? Прошу прощения, если я вас неправильно понял. Прошу прощения!
3. Я рад, что это вам помогает. 🙂
4. Это сработало. Но почему статус 400? Это должно быть 404, верно?
5. когда я ввел это в качестве последнего маршрута, я получил ошибку [ERR_HTTP_HEADERS_SENT]: не удается установить заголовки после их отправки клиенту
Ответ №2:
Если вы просто хотите перенаправить, вы можете просто использовать это:
app.use((req, res) => {
res.status(404).redirect('/MyHomepage')
});
Ответ №3:
Очень просто, вы можете добавить это промежуточное программное обеспечение
app.use(function (req, res, next) {
res.status(404).send("Sorry can't find that!")
})