web-dev-qa-db-fra.com

Route par défaut dans Express.js

J'écris une application avec node.js et express.

J'ai configuré une route par défaut comme ceci:

app.get('/', function(req, res){
  res.sendfile('./views/index.html');
});

Cela fonctionne bien lorsque je suis sur/localhost: port /

Mais dans l'URL quand je tape quoi que ce soit après,/localhost: port/blah j'obtiens une erreur 404, ce qui est logique.

Je veux configurer une route par défaut afin que, peu importe ce que je tape dans l'URL après localhost: port/il devrait tous récupérer le même fichier html.

J'ai essayé de changer/en *:

app.get('*', function(req, res){
  res.sendfile('./views/index.html');
});

mais après cela, je commence à obtenir cette erreur dans la console et rien ne s'affiche:

SyntaxError non capturée: jeton inattendu <

dans tous mes fichiers Javascript:: 3000/scripts/myscript.js: 1

en quelque sorte mon fichier javascript affiche le contenu de HTML

=== EDIT ====

J'ai utilisé cela et cela a bien fonctionné pour les URL de premier niveau: comme loclhost: port/blah

app.use(function(req, res){
    res.sendfile('./views/index.html');
});

mais lorsque les URL sont à plusieurs niveaux, je vois le même problème que celui décrit précédemment localhost: port/blah/foo Le problème ici est que le routeur recherche un répertoire public sous le dossier/blah pour tous les fichiers javascript et CSS dans ce cas, ce qui ne n'existe pas. Et il renvoie le fichier HTML par défaut. Comment puis-je réparer ça?

================== MODIFICATION DE L'AFFICHAGE DU CODE ENTIER ============================ ==============

var http = require('http');
var express = require('express');
var api = require('./routes/api');
var mongoose = require('mongoose');
var app = express();


mongoose.connect('mongodb://localhost/mydb');

app.set('port', process.env.PORT || 3000);
app.set('view engine', 'jade');

app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(app.router);

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

app.get('/api/user/:userid', api.getUserInfo);

app.get('/', function(req, res){
  res.sendfile('./views/index.html');
});

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

En plus de cela, j'ai un HTML avec un myscript lié,

<script type="text/javascript" src="./scripts/myscript.js" ></script>
16
sublime

Comme indiqué ici , vous pouvez ajouter ce middleware juste après votre logique de routage:

   app.use(function(req, res){
       res.send(404);
   });

Vous pourriez trouver cette réponse également utile.

Bien sûr, vous devez adapter la partie res.send() pour répondre à vos besoins.

J'espère que cela aide.

15
jpgc

Ajoutez cet itinéraire au après tous vos itinéraires précédents

app.get('*',function (req, res) {
        res.redirect('/');
    });

Cela redirigera toute route non gérée vers l'index "/"

19
dam1

Avec la nouvelle version d'express, je suggère d'utiliser res.sendStatus car res.send est obsolète.

Express v3

app.use(function(req, res){
   res.send(404);
});

Express v4

app.use(function(req, res){
   res.sendStatus(404);
});
3
Michael Warner