2013-11-27 3 views
0

Я просто хочу, чтобы подтвердить, что это действительно невозможно иметь промежуточный слой ручку вещь Лика 404,500, когда они вернутся, таким образом:Как поймать res.send (404) в производстве ExpressJS

exports.index = function(req, res) { 
    res.send(404); 
} 

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

Пробовал очистить мою обработку ошибок и после большого количества поисковых запросов, похоже, что я должен создать объект ошибки с сообщением Not Found, в котором мое промежуточное ПО может справиться с этим. Такие как https://github.com/robrighter/node-boilerplate/blob/master/templates/app/server.js

Исправить?

+1

Просто добавьте 404 маршрут, как поймать все маршрут после статического маршрута и все маршруты, которые вы указали, и он поймает все URL-адреса, которые не имеют соответствующего статического файла или маршрута, и вы можете отправить страницу 404 вместо этого, и вы сделали бы это, используя что-то вроде 'res.status (404) .send ('

Это - то, где моя страница супер 404 идет

'); ' – adeneo

+0

Ловить 404 как последний маршрут не проблема - в основном во многих вызовах базы данных, когда элемент не найден Я просто хочу отправить 404 - так что технически у меня есть маршрут, но вы хотите отправить 404 или 401 и т. д. – cyberwombat

+0

Затем вы используете функцию next(), чтобы перейти к следующему согласующему маршруту, и это, вероятно, последний путь 404 для всех. – adeneo

ответ

0

В маршрутах сделать что-то вроде:

exports.index = function(req, res, next) { 
    contact_db(function(result) { 
     if (result) { 
      res.end(JSON.stringify(result)); 
     }else{ 
      next(); 
     } 
    }); 
} 

exports.error = function(req, res) { 
    res.status(404).send('Not Found !!!'); 
} 

и где вы определяете их, сделать что-то вроде

app.use(express.static()); 

app.get('/index', routes.index); 

app.get('*', routes.error); 

упрощенным сделать точку, вам придется адаптироваться к однако вы» re настройки ваших маршрутов и т. д.

+0

Тот же вопрос, о котором я прокомментировал выше. Для того, чтобы узнать код состояния, мне нужно выполнить res.status (404); next() then проверьте, является ли оно 404 в промежуточном программном обеспечении или последнем маршруте - я использую 404 в качестве примера. Я предполагаю, что ошибки выбрасываются – cyberwombat

+0

Не уверен, что я понял, у вас есть один маршрут, который соответствует текущему URL-адресу, и если что-то пойдет не так во время вызова БД на этом маршруте, вы просто вызываете следующий() обратный вызов, и он возвращается и начинает искать другие подходящие маршруты, и он не должен действительно найти их, поэтому он попадает в последний ловушки всего маршрута, и именно там вы отправляете заголовки и ответ. – adeneo

+0

Для 404 только это сработает - но как следующий соответствующий маршрут узнает, если это 500, 401, 400 и т. Д., Если я не скажу, выполнив res.status()? Таким образом, теперь это либо res.status (500); next(), либо просто res.send (500) и выдают ошибку, которая кажется более чистой. Наверное, я надеялся поймать такие вещи, как res.отправьте (500), как ошибка - возможно, какое-то событие, вызванное ответом на изменение кода состояния или такое – cyberwombat

0

OK - Исключено событие финиша, которое может использовать промежуточное программное обеспечение, но ответ прекратился к тому времени, поэтому он полезен только для ведения журнала. Так что я думаю, ответ в том, что это не возможно сделать - это либо сделать res.status(401); throw new Error('No entry!') тип вещей или пролонгация ошибки, такие как https://github.com/machadogj/node-simple-errors

// "Catch" all status code 
app.use(function(req, res, next) { 
    res.on('finish', function() { 
    // Do whatever based on status code 
    console.log(res.statusCode); 
    }); 
    next(); 
}); 

app.use(app.router); 

app.get('/missing', function(req, res, next) { 
    res.send(404); 
}); 
Смежные вопросы