Error: no se especificó motor predeterminado y no se proporcionó ninguna extensión

Estoy trabajando en la configuración de un servidor http utilizando node.js y engine. Sin embargo, sigo encontrándome con problemas de los que tengo poca información sobre cómo resolver. Agradecería ayuda para resolver esto, por favor. Gracias por adelantado.

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 trim_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) 

A continuación se muestra lo que he configurado para poner en marcha este motor.

 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('strict 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();// trigger 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){// trigger a 403 error var err = new Error('not allowed!'); err.status = 403; next(err); }); app.get('/500', function(req, res, next){// trigger 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'); }; 

Te estás perdiendo el motor de visualización, por ejemplo, usa jade :

cambia tu

 app.set('view engine', 'html'); 

con

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

Si quieres usar una syntax amigable html usa en su lugar ejs

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

EDITAR

Como puede leer desde 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 {String} 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); } 

Debe haber instalado un default engine

Vista de diseño predeterminado de la búsqueda program.template por program.template como puede leer a continuación:

 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; } }); 

y como puedes leer a continuación:

 program.template = 'jade'; if (program.ejs) program.template = 'ejs'; if (program.jshtml) program.template = 'jshtml'; if (program.hogan) program.template = 'hjs'; 

el motor de vista predeterminado es jade

Las cosas res.render emitirán un error si no estás usando un motor de visualización.

Si solo desea servir json, reemplace res.render('error', { error: err }); líneas en tu código con:

 res.json({ error: err }) 

PD: La gente generalmente también tiene un mensaje en el objeto devuelto:

 res.status(err.status || 500); res.json({ message: err.message, error: err }); 

Comente las líneas de res.render en su código y agregue el next(err); en lugar. Si no está utilizando un motor de vista, las cosas res.render arrojarán un error.

Lo siento, también tendrás que comentar esta línea:

 app.set('view engine', 'html'); 

Mi solución resultaría en no usar un motor de vista. No necesita un motor de vista, pero si ese es el objective, intente esto:

 app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); //swap jade for ejs etc 

También necesitará las líneas res.render cuando use un motor de visualización. Algo como esto:

 // 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 desea renderizar un archivo html

 response.sendfile('index.html'); 

entonces eliminas del

 app.set('view engine', 'html'); 

lo único es poner su index.html en vistas. o hacer pública la carpeta como estática y poner el index.html en público

Si todo lo que se necesita es enviar código html en línea en el código, podemos usar a continuación

 var app = express(); app.get('/test.html', function (req, res) { res.header('Content-Type', 'text/html').send("my html code"); }); 

Acabo de recibir este mensaje de error, y el problema fue que no estaba configurando mi middleware correctamente.

Estoy construyendo un blog en la stack MEAN y necesito un análisis del cuerpo para los archivos .jade que estaba usando en el lado frontal. Aquí está el fragmento de código de mi archivo ” /middleware/index.js “, de mi proyecto.

 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})); 

Además, aquí está mi archivo ” package.json “, puede estar usando diferentes versiones de tecnologías. Nota: como no estoy seguro de las dependencias entre ellos, incluyo todo el archivo aquí:

 "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" } 

¡Espero que esto ayude a alguien! ¡Todo lo mejor!

Las respuestas anteriores son correctas, pero descubrí que un simple error tipográfico también puede generar este error. Por ejemplo, tuve var router = express () en lugar de var router = express.Router () y obtuve este error. Entonces debería ser lo siguiente:

 // 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'); }) 

Puede usar el controlador de error expreso para usar páginas html estáticas para el manejo de errores y para evitar definir un manejador de vista.

El error probablemente fue causado por un 404, tal vez un favicon faltante (aparente si había incluido el mensaje de la consola anterior). El ‘controlador de vista’ de ‘html’ no parece ser válido en 4.x express.

Independientemente de la causa, puede evitar definir un manejador de vistas (válido) siempre que modifique elementos adicionales de su configuración.

Tus opciones para solucionar este problema son:

  • Definir un controlador de vista válido como en otras respuestas
  • Utilice send () en lugar de renderizar para devolver el contenido directamente

http://expressjs.com/en/api.html#res.render

El uso de render sin un archivo de ruta invoca automáticamente un manejador de vista como con las dos líneas siguientes de su configuración:

 res.render('404', { url: req.url }); 

y:

 res.render('500); 

Asegúrese de instalar express-error-handler con:

 npm install --save express-error-handler 

Luego, impórtalo en tu app.js

 var ErrorHandler = require('express-error-handler'); 

A continuación, cambie su manejo de errores para usar:

 // 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);