web-dev-qa-db-fra.com

Erreur: Échec de la recherche dans Express

Note : ma réponse automatique à la fin du message

J'essaie de faire une meilleure expérience de nodeJS et je n'aime pas vraiment avoir tout le script dans un seul fichier.

donc, après un post ici, j'utilise cette structure

./
 config/
   enviroment.js
   routes.js
 public/
   css/
     styles.css
   images
 views
   index
     index.jade
   section
     index.jade
   layout.jade
 app.js

Mes fichiers sont en ce moment:

app.js

var express = require('express');
var app = module.exports = express.createServer();

require('./config/enviroment.js')(app, express);
require('./config/routes.js')(app);

app.listen(3000);

enviroment.js

module.exports = function(app, express) {
    app.configure(function() {
        app.use(express.logger());
        app.use(express.static(__dirname + '/public'));
        app.set('views', __dirname + '/views');
        app.set('view engine', 'jade'); //extension of views

    });

    //development configuration
    app.configure('development', function() {
        app.use(express.errorHandler({
            dumpExceptions: true,
            showStack: true
        }));
    });

    //production configuration
    app.configure('production', function() {
        app.use(express.errorHandler());
    });

};

routes.js

module.exports = function(app) {

    app.get(['/','/index', '/inicio'], function(req, res) {
        res.render('index/index');
    });

    app.get('/test', function(req, res) {
        //res.render('index/index');
    });

};

layout.jade

!!! 5
html
    head
        link(rel='stylesheet', href='/css/style.css')
        title Express + Jade
    body
        #main
            h1 Content goes here
            #container!= body

index/index.jade

h1 algoa

L'erreur que je reçois est:

Erreur: Échec lors de la recherche dans la vue "index/index" à l'adresse Function.render (c:\xampp\htdocs\nodejs\bus\modules_noeud\express\lib\application.js: 495: 17) à l’affichage du rendu (c:\xampp\htdocs\nodejs\bus\modules_noeud\express\lib\response.js: 614: 9) sur ServerResponse.render (c:\xampp\htdocs\nodejs\bus\modules_noeud\express\lib\response.js: 638: 5) sur c:\xampp\htdocs\nodejs\bus\config\routes.js: 4: 7 lors des rappels (c:\xampp\htdocs\nodejs\bus\modems_noeud\express\lib\routeur\index.js: 177: 11) at param (c:\xampp\htdocs\nodejs\bus\modules_noeud\express\lib\routeur\index.js: 151: 11) at pass (c:\xampp\htdocs\nodejs\bus\node_modules\express\lib\routeur\index.js: 158: 5) at Router._dispatch (c:\xampp\htdocs\nodejs\bus\modules_noeud\express\lib\routeur\index.js: 185: 4) sur Object.router [en tant que descripteur] (c:\xampp\htdocs\nodejs\bus\modules_noeud\express\lib\routeur\index.js: 45: 10). at next (c:\xampp\htdocs\nodejs\bus\node_modules\express\node_modules\connect\lib\proto.js: 191: 15)

Mais je ne sais pas vraiment quel est le problème ...

Je commence à penser que c'est parce que les modules exportent ...

Réponse: De loin, la solution unique que j'ai trouvée est de changer le lieu que j'ai défini app.set ('views') et le moteur de vues.

Je l'ai déplacé à l'app.js et maintenant fonctionne bien.

var express = require('express');
var app = module.exports = express.createServer();


require('./config/enviroment.js')(app, express);

app.set('views', __dirname + '/views');
app.set('view engine', 'jade');

require('./config/routes.js')(app);

app.listen(3000);

Je ne comprends pas vraiment la logique derrière cela, mais je vais en supposer un.

50
nax

npm install [email protected] installe la version précédente, si cela vous aide.

Je sais que dans 3.x le mécanisme de présentation de la vue a été supprimé, mais ce n'est peut-être pas votre problème Remplacez également express.createServer() par express()

Mettre à jour:

C'est votre __dirname de environment.js
CA devrait etre:

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

Ajout à la réponse de @ mihai:

Si vous êtes sous Windows, il suffit alors de concaténer __dirname' + '../public' pour obtenir un nom de répertoire incorrect (par exemple: c:\dev\app\module../public).

Utilisez plutôt path, qui fonctionnera indépendamment du système d'exploitation.

var path = require ('path');
app.use(express.static(path.join(__dirname + '.../public')));

path.join normalisera le caractère séparateur de chemin et renverra la valeur de chemin correcte. 

32
Veera

Pour résoudre ce problème, ajoutez le code suivant dans le fichier app.js

app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.set('views', __dirname);

app.get('/', function(req, res){
    res.render("index");
});
4
Codemaker

Au début, j’ai eu la même erreur et j’étais vraiment ennuyé ... vous devez juste avoir ./ avant le chemin vers le modèle

res.render('./index/index');

J'espère que ça marche, a fonctionné pour moi.

4

Vérifiez si vous avez utilisé un moteur de visualisation approprié . Dans mon cas, j'ai mis à jour le npm et je finis par changer le moteur en 'hjs' (j'essayais de désinstaller jade pour utiliser pug) . Jade de hjs dans le fichier app.js a fonctionné pour moi.

 app.set('view engine','jade'); 
2

utiliser ce code pour résoudre le problème 

app.get('/', function(req, res){
    res.render("index");
});
1
KARTHIKEYAN.A

Ce problème est essentiellement dû au nom de fichier sensible à la casse . Par exemple, si vous enregistrez le fichier sous le nom index.jadge, il doit être "index" et non "Index" dans Windows, mais c'est correct, mais sous Linux comme serveur cela va créer un problème.

1) si le nom du fichier est index.jadge

app.get('/', function(req, res){
      res.render("index");
});

2) si le nom du fichier est Index.jadge

app.get('/', function(req, res){
      res.render("Index");
});
1
user9160528

Je viens de remarquer que j'avais nommé mon fichier ' index.html' à la place de 'index.html' avec un espace de début. C'était pourquoi il ne pouvait pas le trouver.

1
Bobby

Vous pouvez définir le chemin d'accès à une constante comme celle-ci et le définir à l'aide de la commande express.

const viewsPath = path.join(__dirname, '../views') 
app.set('view engine','hbs')

 app.set('views', viewsPath)

 app.get('/', function(req, res){

 res.render("index");

});

Cela a fonctionné pour moi

0
Harish-hk

J'avais le même problème et je pouvais le résoudre avec la solution de dougwilson: à partir du 5 avril 2017, Github .

  1. J'ai changé le nom de fichier de index.js à index.pug
  2. Puis utilisé dans la route '/': res.render('index.pug') - au lieu de res.render('index')
  3. Définir la variable d'environnement: DEBUG=express:view Cela fonctionne maintenant comme un charme.
0
Chris

Je change le nom du dossier de vues en views_render et au même problème que précédemment, alors redémarrez server.js et cela fonctionne pour moi.

0
Vivek

Cette erreur ne concerne que le chemin du fichier, c’est tout ce que vous avez à vérifier. Pour moi, mon dossier parent était "Layouts" mais mon fichier réel était layout.html, mon chemin avait des dispositions sur les deux, une fois que j’ai corrigé cette erreur.

0
Hilary Mwape