Não conheço uma função para fazer isso, alguém sabe de uma?
203
Achei este exemplo bastante útil:
https://github.com/visionmedia/express/blob/master/examples/error-pages/index.js
Portanto, é realmente esta parte:
// "app.router" positions our routes
// above the middleware defined below,
// this means that Express will attempt
// to match & call routes _before_ continuing
// on, at which point we assume it's a 404 because
// no route has handled the request.
app.use(app.router);
// Since this is the last non-error-handling
// middleware use()d, we assume 404, as nothing else
// responded.
// $ curl http://localhost:3000/notfound
// $ curl http://localhost:3000/notfound -H "Accept: application/json"
// $ curl http://localhost:3000/notfound -H "Accept: text/plain"
app.use(function(req, res, next){
res.status(404);
// respond with html page
if (req.accepts('html')) {
res.render('404', { url: req.url });
return;
}
// respond with json
if (req.accepts('json')) {
res.send({ error: 'Not found' });
return;
}
// default to plain-text. send()
res.type('txt').send('Not found');
});
app.router
agora está obsoleto. Veja github.com/strongloop/express/wiki/…res.json
vez deres.send()
. Eles se comportariam da mesma forma no seu código, mas usarres.json
fará alguma mágica na conversão automática de objetos em cadeias de caracteres onde.send()
não. Melhor prevenir do que remediar. expressjs.com/api.html#res.jsonEu acho que você deve primeiro definir todas as suas rotas e, como a última rota adiciona
Um aplicativo de exemplo que funciona:
app.js:
fonte
app.get('/public/*', function(req, res){ res.sendfile(__dirname + '/public/' + req.url); })
você pode usar esta rota para enviar arquivos estáticos. funciona bem com a rota "*" acima.app.use(express.static(__dirname + '/public'));
não funciona para mim, com fio.app.use(express.static(...))
veio atrásapp.use(app.router)
. Depois que os troquei, tudo saiu bem.Você pode colocar um middleware na última posição que gera um
NotFound
erroou até renderizar a página 404 diretamente:
fonte
use()
suaapp.router
na última vez. (como no meu caso)GET
s). TentePOST
uma URL aleatória com o outro método; retornará o padrãoCannot POST...
. Um invasor saberá que você está usando o Express.JS.res.render('404')
As respostas acima são boas, mas na metade delas você não receberá 404 quando o código de status HTTP retornou e na outra metade, não será possível renderizar um modelo personalizado. A melhor maneira de ter uma página de erro personalizada (404) no Expressjs é
Coloque esse código no final de todos os seus mapeamentos de URL.
fonte
Na última linha do app.js, basta colocar esta função. Isso substituirá a página de erro padrão de página não encontrada:
Ele substituirá todas as solicitações que não possuem um manipulador válido e renderiza sua própria página de erro.
fonte
A resposta para sua pergunta é:
E há um ótimo artigo sobre por que é o melhor caminho aqui .
fonte
send
eend
?send
Express-Error-Handler permite especificar modelos personalizados, páginas estáticas ou manipuladores de erros para seus erros. Ele também faz outras coisas úteis para o tratamento de erros que todo aplicativo deve implementar, como proteção contra ataques de erro 4xx do DOS e desligamento normal devido a erros irrecuperáveis. Veja como você faz o que está pedindo:
Ou para um manipulador personalizado:
Ou para uma visualização personalizada:
fonte
Há alguns casos em que a página 404 não pode ser gravada para ser executada como a última rota, especialmente se você tiver uma função de roteamento assíncrona que traz uma rota / atrasada para a parte. O padrão abaixo pode ser adotado nesses casos.
fonte
https://github.com/robrighter/node-boilerplate/blob/master/templates/app/server.js
É isso que o node-boilerplate faz.
fonte
fonte
A maneira mais fácil de fazer isso é capturar tudo na página de erro
Então
Agora você pode armazenar todas as suas páginas "html" (incluindo um erro "página" html)) em uma variável
Agora você simplesmente chama as páginas usando o método Get e captura todas as rotas não disponíveis para direcionar para sua página de erro usando app.get ("*")
Não se esqueça de configurar uma porta e escutar para o servidor:
Agora, isso deve mostrar sua página de erro para todos os pontos de extremidade não reconhecidos!
fonte
Embora as respostas acima estejam corretas, para aqueles que desejam que isso funcione no IISNODE, você também precisa especificar
no seu web.config (caso contrário, o IIS consumirá sua saída).
fonte
você pode manipular erros de acordo com o tipo de conteúdo
Além disso, manuseio de acordo com o código de status.
app.js
404.jade
Se você pode usar o res.format, pode escrever um código simples de tratamento de erros.
Recomendação em
res.format()
vez deres.accepts()
.Se o erro 500 ocorrer no código anterior,
if(500 == err.status){. . . }
será chamadofonte
Olá, por favor encontre a resposta
fonte
Se você usar o pacote express-generator:
próximo (err);
Este código envia você para o middleware 404.
fonte
Para enviar para uma página personalizada:
fonte
Eu usei o manipulador abaixo para lidar com o erro 404 com um
.ejs
arquivo estático .Coloque esse código em um script de rota e, em seguida, exigem que
file.js
atravésapp.use()
da suaapp.js
/server.js
/www.js
(se estiver usando IntelliJ para NodeJS)Você também pode usar um
.html
arquivo estático .Dessa forma, o servidor expresso em execução responderá com uma adequada
404 error
e seu site também poderá incluir uma página que exibe corretamente a resposta 404 do servidor. Você também pode incluir umnavbar
em que404 error template
que os links para outros conteúdos importantes do seu site.fonte
Se você deseja redirecionar para páginas de erro de suas funções (rotas), faça o seguinte:
Adicione código geral de mensagens de erro no seu app.js -
Em sua função, em vez de usar um redirecionamento de página de erro, você pode definir primeiro o status do erro e, em seguida, usar next () para que o fluxo de código passe pelo código acima -
fonte
A página 404 deve ser configurada imediatamente antes da chamada para app.listen.Express ter suporte para * nos caminhos da rota. Este é um caractere especial que corresponde a qualquer coisa. Isso pode ser usado para criar um manipulador de rota que corresponda a todas as solicitações.
fonte
Cobertura de todos os verbos HTTP em
express
Para cobrir todos os verbos HTTP e todos os caminhos restantes, você pode usar:
A solução final ficaria assim:
Você não deve esquecer de colocar o roteador no final. Porque a ordem dos roteadores é importante.
fonte
O código acima não funcionou para mim.
Então eu encontrei uma nova solução que realmente funciona!
Ou você pode até renderizá-lo em uma página 404.
Espero que isso tenha ajudado!
fonte
fonte