Error: No default engine was specified and no extension was provided

前端 未结 14 2549
别跟我提以往
别跟我提以往 2020-11-29 18:13

I am working through setting up a http server using node.js and engine. However, I keep running into issues that I have little information on how to resolve I would apprecia

相关标签:
14条回答
  • 2020-11-29 18:37

    I just got this error message, and the problem was that I was not setting up my middleware properly.

    I am building a blog in the MEAN stack and needed body parsing for the .jade files that I was using on the front end side. Here is the snippet of code from my "/middleware/index.js" file, from my project.

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

    Also, here is my "package.json" file, you may be using different versions of technologies. Note: because I am not sure of the dependencies between them, I am including the whole file here:

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

    Hope this helps someone! All the best!

    0 讨论(0)
  • 2020-11-29 18:40

    instead of

    app.get('/', (req, res) => res.render('Hellooooo'))
    

    use

    app.get('/', (req, res) => res.send('Hellooooo'))
    
    0 讨论(0)
  • 2020-11-29 18:41

    The above answers are correct, but I found that a simple typo can also generate this error. For example, I had var router = express() instead of var router = express.Router() and got this error. So it should be the following:

    // 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');
    })
    
    0 讨论(0)
  • 2020-11-29 18:42

    You are missing the view engine, for example use jade:

    change your

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

    with

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

    If you want use a html friendly syntax use instead ejs

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

    EDIT

    As you can read from 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);
    }
    

    You must have installed a default engine

    Express search default layout view by program.template as you can read below:

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

    and as you can read below:

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

    the default view engine is jade

    0 讨论(0)
  • 2020-11-29 18:45

    Comment out the res.render lines in your code and add in next(err); instead. If you're not using a view engine, the res.render stuff will throw an error.

    Sorry, you'll have to comment out this line as well:

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

    My solution would result in not using a view engine though. You don't need a view engine, but if that's the goal, try this:

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

    You'll need the res.render lines when using a view engine as well. Something like this:

    // 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: {}
      });
    });
    
    0 讨论(0)
  • 2020-11-29 18:46

    set view engine following way

    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'jade');
    
    0 讨论(0)
提交回复
热议问题