Nœud Express ejs d'Erreur: Échec de la recherche de la vue “d'erreur” dans le répertoire de vues
Je fais un express app avec ejs et de la mangouste.
J'obtiens cette erreur:
Error: Failed to lookup view "error" in views directory "/Users/ben/Documents/csMSc/web/site/app/views"
at EventEmitter.app.render (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/application.js:555:17)
at ServerResponse.res.render (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:938:7)
at module.exports (/Users/ben/Documents/csMSc/web/site/app/app.js:94:7)
at Layer.handle_error (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/layer.js:58:5)
at trim_prefix (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:300:13)
at /Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:270:7
at Function.proto.process_params (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:321:12)
at IncomingMessage.next (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:261:10)
at fn (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:933:25)
at EventEmitter.app.render (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/application.js:557:14)
at ServerResponse.res.render (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:938:7)
at app.use.res.render.message (/Users/ben/Documents/csMSc/web/site/app/app.js:83:9)
at Layer.handle_error (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/layer.js:58:5)
at trim_prefix (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:300:13)
at /Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:270:7
at Function.proto.process_params (/Users/ben/Documents/csMSsc/web/site/app/node_modules/express/lib/router/index.js:321:12)
de deux appels à res.render()
où les données transmises en revient à partir d'une mangouste requête par exemple:
if(req.query.author !== undefined) {
var author = req.query.author;
Post.find().where('author').equals(author).sort({ created: -1 }).limit(10).exec(function(err, authorsPosts) {
if (err) return res.send("error");
if(authorsPosts.length==0) {
res.render('pages/index', {
viewDataSignStatus: viewDataSignedIn[signedIn],
previews: authorsPosts,
error: "Sorry there are no posts with that tag."
});
} else {
res.render('pages/index', {
viewDataSignStatus: viewDataSignedIn[signedIn],
previews: authorsPosts
});
}
});
}
et l'autre est le même, mais avec une requête de
Post.find( { tags : { $elemMatch: { $in : tagList } } } ).limit(10).exec(function(err, taggedPosts) {
Cependant tous mes autres rendre les appels sur ce point de vue fonctionnent bien, y compris un plus tard dans la même fonction:
//or just latest
Post.find().sort({ created: 1 }).limit(10).exec(function(err, latestPosts) {
if (err) return res.send(err);
res.render('pages/index', {
viewDataSignStatus: viewDataSignedIn[signedIn],
previews: latestPosts
});
});
où Im assez sûr latestPosts est exactement dans le même format que authorsPosts dans l'un au-dessus.
Il n'y a pas d'appels à effectuer le rendu d'une vue appelée erreur.
L'erreur des données transmises à certains appels à res.render('pages/index')
ci-dessus est transmis à l'aide d'un filtre personnalisé
//custom ejs filter, sets to default value if data not supplied
ejs.filters.get = function(obj, prop, def) {
return obj[prop] === undefined ? def : obj[prop];
};
qui apparaît dans le fichier app/views/pages/index.ejs comme
<p><%=: locals | get:'error','' %> </p>
Mon ejs de configuration ressemble à:
//view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.engine('ejs', require('ejs').renderFile);
heres l'ensemble de la délinquance de la route de la fonction dans l'ensemble de ses horribles gloire
router.get('/', function(req, res, next) {
var accountController = new AccountController(User, req.session);
console.log("here1");
var signedIn = accountController.session.userProfileModel !== undefined ? 1 : 0;
console.log("here2");
//Author search
if(req.query.author !== undefined) {
var author = req.query.author;
Post.find().where('author').equals(author).sort({ created: -1 }).limit(10).exec(function(err, authorsPosts) {
if (err) return res.send("error");
console.log("\n\nAuthorsPosts:" +authorsPosts);
console.log("\n\authorsPosts.length: " +authorsPosts.length);
console.log("authors post.constructor = " +authorsPosts.constructor);
if(authorsPosts.length==0) {
console.log("length=0");
res.render('pages/index', {
viewDataSignStatus: viewDataSignedIn[signedIn],
previews: authorsPosts,
error: "Sorry there are no posts with that tag."
});
} else {
res.render('pages/index', {
viewDataSignStatus: viewDataSignedIn[signedIn],
previews: authorsPosts
});
}
});
}
//Tag search
if(req.query.filter !== undefined) {
var tagList = req.query.filter.constructor == Array ? req.query.filter : req.query.filter.split(",");
Post.find( { tags : { $elemMatch: { $in : tagList } } } ).limit(10).exec(function(err, taggedPosts) {
if (err) return res.send("error");
console.log("\n\taggedPosts.length: " +taggedPosts.length);
if(taggedPosts.length==0) {
console.log("length=0");
res.render('pages/index', {
viewDataSignStatus: viewDataSignedIn[signedIn],
previews: taggedPosts,
error: "Sorry there are no posts with that tag."
});
} else {
console.log("\n\ntaggedPosts:\n\n" +taggedPosts);
res.render('pages/index', {
viewDataSignStatus: viewDataSignedIn[signedIn],
previews: taggedPosts
});
}
});
}
//or just latest
Post.find().sort({ created: 1 }).limit(10).exec(function(err, latestPosts) {
if (err) return res.send(err);
res.render('pages/index', {
viewDataSignStatus: viewDataSignedIn[signedIn],
previews: latestPosts
});
});
});
Quoi de plus, il n'est pas totalement pas de travail. Lorsque le code est de rendre ces appels, il jette l'erreur et la page d'habitude se fige, vous ne pouvez pas cliquer sur un lien, puis, si je recharge une fois ou deux fois, il travaillera, et de rendre le modèle avec les données correctes.
Aussi quand je voyage à '/' à l'un de ces chaînes de requête par exemple GET /?filter=Marc%20Behrens
il obtient aussi loin de l'impression de tous les anciens messages et puis génère l'erreur.
Merci!
Edit: merci Alex Ford.
nouveau message d'erreur est:
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:690:11)
at ServerResponse.header (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:700:10)
at ServerResponse.send (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:154:12)
at ServerResponse.json (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:240:15)
at ServerResponse.send (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:142:21)
at module.exports (/Users/ben/Documents/csMSc/web/site/app/app.js:100:9)
at Layer.handle_error (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/layer.js:58:5)
at trim_prefix (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:300:13)
at /Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:270:7
at Function.proto.process_params (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:321:12)
at next (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:261:10)
at Layer.handle_error (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/layer.js:60:5)
at trim_prefix (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:300:13)
at /Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:270:7
at Function.proto.process_params (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:321:12)
at next (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:261:10)
- Votre nouveau message d'erreur signifie que vous êtes en essayant de travailler avec une réponse qui a déjà été envoyé. Quelque part vous êtes d'appel
res.send
oures.render
puis en l'appelant de nouveau à une date ultérieure. Vous pouvez publier qu'un code plus complet de l'échantillon de votre application, ou peut-être même un lien vers le référentiel si c'est public? Je serais heureux de les étudier. - Oui, je ne vois pas où il arrive moi-même. L'ensemble de l'application est ici: github.com/bcrabbe/songsphere Merci beaucoup!
Vous devez vous connecter pour publier un commentaire.
Ma conjecture pour les "headers already sent" l'erreur, c'est que votre
//or just latest
code est en cours d'exécution, même lorsque l'un des ci-dessus si des instructions s'exécute. Si c'est le cas, alors vous aurez sûrement à faire plusieurs appels àres.render
oures.send
. Essayez ceci:Vous rencontrez une erreur et la valeur par défaut express gestionnaire d'erreur est d'essayer d'afficher le message d'erreur à l'utilisateur par le rendu de l'erreur de la vue. Avez-vous utilisé un générateur pour produire de votre initial de l'application? Si oui, avez-vous supprimer l'erreur vue depuis le répertoire de vues?
Soit modifier la valeur par défaut express gestionnaire d'erreur (probablement dans votre
app.js
), de sorte qu'elle crache le raw d'erreur au lieu d'essayer de le rendre dans une jolie vue, ou ajouter l'erreur de la vue qu'il cherche.Le gestionnaire d'erreur générés par l'express-cli ressemble généralement à ceci:
Avis il essaie de
render('error'
et à défaut de trouver une vue nommée "erreur". Ce qui fait un gestionnaire d'erreur est le simple fait qu'elle accepte 4 arguments, le premier étant l'erreur. Express sait que si une erreur est capturé alors qu'il devrait aller vers le bas pour que le gestionnaire d'.Aussi loin que votre erreur réelle qui est à l'origine du gestionnaire d'erreur à l'exécution, je ne suis pas sûr. Vous aurez besoin de fixer de manière à ce que l'erreur affiche correctement, puis vous serez en mesure de débogage à partir de là.
J'ai eu cette erreur, à l'aide de la jsx moteur si. Je l'ai fixée par s'assurer que le fichier que j'avais dans mon dossier de vue a le droit d'extension
*.jsx
dans mon cas. Je n'ai comme justeindex.js
.ce que je n'ai pas fait droit est l'omission de l'extension .html dans le parcours de répertoire.