错误:没有指定默认引擎,也没有提供扩展名
我正在通过使用node.js和引擎设置一个http服务器。 但是,我一直遇到的问题,我没有什么信息如何解决我将不胜感激请求解决这个问题。 提前致谢。
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)
下面是我设置启动这个引擎。
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'); };
您缺less视图引擎,例如使用jade :
改变你的
app.set('view engine', 'html');
同
app.set('view engine', 'jade');
如果你想使用HTML友好的语法使用,而不是ejs
app.engine('html', require('ejs').renderFile); app.set('view engine', 'html');
编辑
正如你可以从view.js快速查看模块读取
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); }
您必须安装了default engine
通过program.template
Express
search默认布局视图,如下所示:
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; } });
正如你可以阅读下面:
program.template = 'jade'; if (program.ejs) program.template = 'ejs'; if (program.jshtml) program.template = 'jshtml'; if (program.hogan) program.template = 'hjs';
默认的视图引擎是jade
如果你不使用视图引擎,res.render会抛出一个错误。
如果你只是想服务jsonreplaceres.render('error', { error: err });
在你的代码行中:
res.json({ error: err })
PS:人们通常在返回的对象中也有消息:
res.status(err.status || 500); res.json({ message: err.message, error: err });
res.render
代码中的res.render
行,然后添加next(err);
代替。 如果你没有使用视图引擎,那么res.render
会引发错误。
对不起,您还必须注释掉这一行:
app.set('view engine', 'html');
我的解决scheme将导致不使用视图引擎。 你不需要一个视图引擎,但如果这是目标,试试这个:
app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); //swap jade for ejs etc
在使用视图引擎时也需要res.render
行。 像这样的东西:
// 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: {} }); });
如果你想渲染一个HTML文件使用
response.sendfile('index.html');
那么你删除的
app.set('view engine', 'html');
唯一的东西是把你的index.html在视图中。 或者将公共文件夹设为静态,并将index.html公开
我刚收到这个错误信息,问题是我没有正确设置中间件。
我在MEAN堆栈中构build了一个博客,并且需要正文parsing我在前端使用的.jade文件。 以下是我的项目中“ /middleware/index.js ”文件的代码片段。
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}));
另外,这里是我的“ package.json ”文件,您可能正在使用不同版本的技术。 注意:因为我不确定它们之间的依赖关系,所以我在这里包含整个文件:
"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" }
希望这可以帮助别人! 祝一切顺利!
上面的答案是正确的,但我发现一个简单的错字也可以产生这个错误。 例如,我有var router = express()而不是var router = express.Router()并得到这个错误。 所以它应该是以下内容:
// 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'); })
如果只需要在代码中内联发送html代码,我们可以在下面使用
var app = express(); app.get('/test.html', function (req, res) { res.header('Content-Type', 'text/html').send("<html>my html code</html>"); });