Je travaille à configurer un serveur http en utilisant node.js et engine. Cependant, je continue à me heurter à des problèmes pour lesquels je ne dispose que de peu d’informations sur la manière de résoudre ce problème. Merci d’avance.
Error: No default engine was specified and no extension was provided. at new View (...\node_modules\express\lib\view.js:41:42) at Function.app.render (...\node_modules\express\lib\application.js:484:12) at ServerResponse.res.render (...\node_modules\express\lib\response.js:783:7) at Layer.handle (...\app.js:123:7) at sortingm_prefix (...\node_modules\express\lib\router\index.js:225:17) at c (...\node_modules\express\lib\router\index.js:198:9) at Function.proto.process_params (...\node_modules\express\lib\router\index.js:253:12) at next (...\node_modules\express\lib\router\index.js:189:19) at next (...\node_modules\express\lib\router\index.js:202:7) at next (...\node_modules\express\lib\router\index.js:166:38)
Voici ce que j’ai mis en place pour démarrer ce moteur.
var http = require('http'); var module = require("module") var logger = require('morgan'); var express = require('express'); var app = module.exports = express(); var silent = 'test' == process.env.NODE_ENV; var httpServer = http.createServer(app); // app middleware app.enable('ssortingct routing'); // app.all('*', function(req, res, next)/*** CORS support.*/ // { // if (!req.get('Origin')) return next();// use "*" here to accept any origin // res.set('Access-Control-Allow-Origin', 'http://localhost:3000'); // res.set('Access-Control-Allow-Methods', 'GET, POST'); // res.set('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type'); // res.set('Access-Control-Allow-Max-Age', 3600); // if ('OPTIONS' == req.method) return res.send(200); // next(); // }); app.set('views', __dirname + '/views'); // general config app.set('view engine', 'html'); app.get('/404', function(req, res, next){ next();// sortinggger a 404 since no other middleware will match /404 after this one, and we're not responding here }); app.get('/403', function(req, res, next){// sortinggger a 403 error var err = new Error('not allowed!'); err.status = 403; next(err); }); app.get('/500', function(req, res, next){// sortinggger a generic (500) error next(new Error('keyboard cat!')); }); app.use(express.static(__dirname + '/public')); //error handlers app.use(logErrors); app.use(clientErrorHandler); app.use(errorHandler); // middleware with an arity of 4 are considered error handling middleware. When you next(err) // it will be passed through the defined middleware in order, but ONLY those with an arity of 4, ignoring regular middleware. function clientErrorHandler(err, req, res, next) { if (req.xhr) {// whatever you want here, feel free to populate properties on `err` to treat it differently in here. res.send(err.status || 500, { error: err.message }); } else { next(err);} }; // create an error with .status. we can then use the property in our custom error handler (Connect repects this prop as well) function error (status, msg) { var err = new Error(msg); err.status = status; return err; }; function logErrors (err, req, res, next) { console.error(err.stack); next(err); }; function errorHandler (err, req, res, next) { res.status(500); res.render('error', { error: err }); }; // Error handlers // 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); if (req.accepts('html')) {// respond with html page res.render('404', { url: req.url }); return; } if (req.accepts('json')) {// respond with json res.send({ error: 'Not found' }); return; } res.type('txt').send('Not found');// default to plain-text. send() }); // error-handling middleware, take the same form as regular middleware, however they require an // arity of 4, aka the signature (err, req, res, next).when connect has an error, it will invoke ONLY error-handling middleware. // If we were to next() here any remaining non-error-handling middleware would then be executed, or if we next(err) to // continue passing the error, only error-handling middleware would remain being executed, however here // we simply respond with an error page. app.use(function(err, req, res, next){ // we may use properties of the error object here and next(err) appropriately, or if we possibly recovered from the error, simply next(). res.status(err.status || 500); res.render('500', { error: err }); }); if (!module.parent) {// assigning to exports will not modify module, must use module.exports app.listen(3000); silent || console.log('Express started on port 3000'); };
Vous manquez le moteur de vue, par exemple, utilisez jade :
change ton
app.set('view engine', 'html');
avec
app.set('view engine', 'jade');
Si vous voulez utiliser une syntaxe HTML conviviale, utilisez plutôt ejs
app.engine('html', require('ejs').renderFile); app.set('view engine', 'html');
MODIFIER
Comme vous pouvez le lire depuis view.js Express View Module
module.exports = View; /** * Initialize a new `View` with the given `name`. * * Options: * * - `defaultEngine` the default template engine name * - `engines` template engine require() cache * - `root` root path for view lookup * * @param {Ssortingng} name * @param {Object} options * @api private */ function View(name, options) { options = options || {}; this.name = name; this.root = options.root; var engines = options.engines; this.defaultEngine = options.defaultEngine; var ext = this.ext = extname(name); if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no extension was provided.'); if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') + this.defaultEngine); this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express); this.path = this.lookup(name); }
Vous devez avoir installé un default engine
Recherche par défaut de la mise en page par program.template
comme vous pouvez le lire ci-dessous:
mkdir(path + '/views', function(){ switch (program.template) { case 'ejs': write(path + '/views/index.ejs', ejsIndex); break; case 'jade': write(path + '/views/layout.jade', jadeLayout); write(path + '/views/index.jade', jadeIndex); break; case 'jshtml': write(path + '/views/layout.jshtml', jshtmlLayout); write(path + '/views/index.jshtml', jshtmlIndex); break; case 'hjs': write(path + '/views/index.hjs', hoganIndex); break; } });
et comme vous pouvez le lire ci-dessous:
program.template = 'jade'; if (program.ejs) program.template = 'ejs'; if (program.jshtml) program.template = 'jshtml'; if (program.hogan) program.template = 'hjs';
le moteur de vue par défaut est jade
Les éléments res.render génèrent une erreur si vous n’utilisez pas de moteur de vue.
Si vous voulez simplement servir json, remplacez res.render('error', { error: err });
lignes dans votre code avec:
res.json({ error: err })
PS: Les gens ont généralement aussi un message dans l’object retourné:
res.status(err.status || 500); res.json({ message: err.message, error: err });
Commentez les lignes res.render
dans votre code et ajoutez-les next(err);
au lieu. Si vous n’utilisez pas de moteur de visualisation, les éléments res.render
une erreur.
Désolé, vous devrez également commenter cette ligne:
app.set('view engine', 'html');
Ma solution aboutirait à ne pas utiliser de moteur de vue. Vous n’avez pas besoin d’un moteur de visualisation, mais si tel est l’objective, essayez ceci:
app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); //swap jade for ejs etc
Vous aurez également besoin des lignes res.render
lors de l’utilisation d’un moteur de vue. Quelque chose comme ça:
// error handlers // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); next(err); res.render('error', { message: err.message, error: {} }); });
Si vous souhaitez rendre un fichier HTML, utilisez
response.sendfile('index.html');
alors vous retirez de la
app.set('view engine', 'html');
La seule chose est de mettre votre index.html dans les vues. ou rendre le dossier public en tant que statique et mettre l’index.html en public
Si tout ce dont vous avez besoin est d’envoyer du code HTML en ligne dans le code, nous pouvons utiliser ci-dessous
var app = express(); app.get('/test.html', function (req, res) { res.header('Content-Type', 'text/html').send("my html code"); });
Je viens de recevoir ce message d’erreur et le problème était que je ne configurais pas correctement mon middleware.
Je construis un blog dans la stack MEAN et j’ai besoin d’une parsing du corps pour les fichiers .jade que j’utilisais du côté frontal. Voici l’extrait de code de mon fichier ” /middleware/index.js “, de mon projet.
var express = require('express'); var morgan = require('morgan'); var session = require('express-session'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); module.exports = function (app) { app.use(morgan('dev')); // Good for now // In the future, use connect-mongo or similar // for persistant sessions app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.use(cookieParser()); app.use(session({secret: 'building a blog', saveUninitialized: true, resave: true}));
En outre, voici mon fichier ” package.json “, vous utilisez peut-être différentes versions de technologies. Note: parce que je ne suis pas sûr des dépendances entre eux, j’inclus tout le fichier ici:
"dependencies": { "body-parser": "1.12.3", "consolidate": "0.12.1", "cookie-parser": "1.3.4", "crypto": "0.0.3", "debug": "2.1.1", "express": "4.12.2", "express-mongoose": "0.1.0", "express-session": "1.11.1", "jade": "1.9.2", "method-override": "2.3.2", "mongodb": "2.0.28", "mongoose": "4.0.2", "morgan": "1.5.1", "request": "2.55.0", "serve-favicon": "2.2.0", "swig": "1.4.2" }
J’espère que cela aide quelqu’un! Bonne chance!
Les réponses ci-dessus sont correctes, mais j’ai trouvé qu’une simple faute de frappe pouvait également générer cette erreur. Par exemple, var router = express () au lieu de var router = express.Router () et j’ai eu cette erreur. Donc, ce devrait être le suivant:
// App.js var express = require('express'); var app = express(); var bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({ extended:false})); // assuming you put views folder in the same directory as app.js app.set('views', __dirname + '/views') app.engine('ejs', ejs.renderFile); app.set('view engine', 'ejs'); // router - wherever you put it, could be in app.js var router = express.Router(); router.get('/', function (req,res) { res.render('/index.ejs'); })
Vous pouvez utiliser express-error-handler pour utiliser des pages HTML statiques pour la gestion des erreurs et pour éviter de définir un gestionnaire de vues.
L’erreur a probablement été causée par un 404, peut-être un favicon manquant (apparent si vous aviez inclus le message de la console précédente). Le ‘gestionnaire de vues’ de ‘html’ ne semble pas être valide dans 4.x express.
Quelle que soit la cause, vous pouvez éviter de définir un gestionnaire de vue (valide) tant que vous modifiez des éléments supplémentaires de votre configuration.
Les options pour résoudre ce problème sont les suivantes:
http://expressjs.com/en/api.html#res.render
L’utilisation du rendu sans chemin de fichier appelle automatiquement un gestionnaire de vue, comme dans les deux lignes suivantes de votre configuration:
res.render('404', { url: req.url });
et:
res.render('500);
Assurez-vous d’installer Express-Error-Handler avec:
npm install --save express-error-handler
Puis importez-le dans votre app.js
var ErrorHandler = require('express-error-handler');
Puis changez votre gestion des erreurs pour utiliser:
// define below all other routes var errorHandler = ErrorHandler({ static: { '404': 'error.html' // put this file in your Public folder '500': 'error.html' // ditto }); // any unresolved requests will 404 app.use(function(req,res,next) { var err = new Error('Not Found'); err.status(404); next(err); } app.use(errorHandler);