Hata: Varsayılan motor belirtilmedi ve uzantı sağlanmadı


132

Node.js ve motor kullanarak bir http sunucusu kurmaya çalışıyorum. Ancak, nasıl çözüleceğine dair çok az bilgiye sahip olduğum sorunlarla karşılaşmaya devam ediyorum, bunu çözmek için biraz yardım almaktan memnun olurum lütfen.

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şağıda bu motoru başlatmak için kurduğum şey var.

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

Yanıtlar:


120

Res.render öğeleri, bir görünüm motoru kullanmıyorsanız bir hata verecektir.

Yalnızca json'a hizmet vermek istiyorsanız res.render('error', { error: err });, kodunuzdaki satırları şu şekilde değiştirin :

res.json({ error: err })

Not: İnsanlar genellikle döndürülen nesnede de bir mesaja sahiptir:

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

102

Görünüm motorunu kaçırıyorsunuz, örneğin yeşim kullanın :

değiştir

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

ile

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

HTML dostu bir sözdizimi kullanmak istiyorsanız bunun yerine ejs kullanın

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

DÜZENLE

View.js Ekspres Görünüm Modülünden okuyabileceğiniz gibi

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

Bir default engine

Expressprogram.templateaşağıda okuyabileceğiniz gibi varsayılan düzen görünümünde arama yapı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;

      }
    });

ve aşağıda okuyabileceğiniz gibi:

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

varsayılan görünüm motoru jade


2
Merhaba, bunun nasıl çalıştığını biraz daha açıklar mısınız? Node.js üzerinde okumaya başladım, ihtiyacım olan tek şeyin bu olduğunu düşündüm ama yine de sayfalarımın görüntülenmesini sağlayamadığımda nedenini araştırdım ve ekspres ile ilgili bilgilere ulaştım. Şimdi ekspres 4.2 sayfasındaki bilgileri takip ettim ve yukarıda yardımcı olduğunuz hatayla karşılaştım. Şimdi ejlerim var ve hala ihtiyacım olan tek şey bu gibi görünmüyor. Lütfen bana bunun nasıl çalışması gerektiğine dair bir fikir verir misiniz?
Kobojunkie


Görünümleri işlerken not alsanız bile, sizde açıkça bir görünüm motoru tanımlamanız gerektiğini okumuştum. ama durum böyle değil.
stevejpurves

15

Dışında açıklama res.renderKodunuzdaki çizgiler ve eklemek next(err);yerine. Bir görünüm motoru kullanmıyorsanız, bu res.renderşeyler bir hata verecektir.

Üzgünüz, bu satırı da yorumlamanız gerekecek:

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

Benim çözümüm bir görünüm motoru kullanmamayla sonuçlanacaktır. Bir görüntüleme motoruna ihtiyacınız yok, ancak hedef buysa, şunu deneyin:

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

res.renderBir görünüm motoru kullanırken de çizgilere ihtiyacınız olacak . Bunun gibi bir şey:

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

12

Bir html dosyası oluşturmak istiyorsanız, şunu kullanın:

response.sendfile('index.html');

Ardından şunları kaldırırsınız:

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

Dayan *.htmliçinde viewsdizin veya bir hizmet publicstatik dir olarak dizin ve koyun index.htmliçinde publicdir.


4
response.sendfile()kullanımdan kaldırıldı, response.sendFile()bunun yerine kullanın. Büyük "F" harfine dikkat edin.
Pramesh Bajracharya

6

görünüm motorunu aşağıdaki şekilde ayarla

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

4

Gerekli olan tek şey kodda html kodunu satır içi göndermekse, aşağıda kullanabiliriz

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

0

Bu hata mesajını yeni aldım ve sorun, ara yazılımımı düzgün şekilde ayarlamamış olmamdı.

MEAN yığınında bir blog oluşturuyorum ve ön uç tarafında kullandığım .jade dosyaları için gövde ayrıştırmaya ihtiyacım vardı . İşte projemdeki " /middleware/index.js " dosyamdaki kod parçacığı .

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

Ayrıca, işte benim " package.json " dosyam , teknolojilerin farklı sürümlerini kullanıyor olabilirsiniz. Not: Aralarındaki bağımlılıklardan emin olmadığım için tüm dosyayı buraya ekliyorum:

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

Umarım bu birine yardımcı olur! Herşey gönlünce olsun!


0

Yukarıdaki cevaplar doğrudur, ancak basit bir yazım hatasının da bu hatayı oluşturabileceğini buldum. Örneğin, var router = express.Router () yerine var router = express () vardı ve bu hatayı aldım. Öyleyse aşağıdaki gibi olmalıdır:

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

Hata işleme için statik html sayfalarını kullanmak ve bir görünüm işleyicisini tanımlamaktan kaçınmak için express-error-handler'ı kullanabilirsiniz.

Hatanın nedeni muhtemelen bir 404, belki de eksik bir favicon (önceki konsol mesajını eklediyseniz görünür). 'Html'nin' görünüm işleyicisi '4.x express'te geçerli görünmüyor.

Nedeni ne olursa olsun, konfigürasyonunuzun ek öğelerini değiştirdiğiniz sürece (geçerli) bir görünüm işleyicisi tanımlamaktan kaçınabilirsiniz.

Bu sorunu çözmek için seçenekleriniz şunlardır:

  • Diğer cevaplarda olduğu gibi geçerli bir görüntüleme işleyicisi tanımlayın
  • İçeriği doğrudan döndürmek için render yerine send () kullanın

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

Dosya yolu olmadan oluşturmayı kullanmak, yapılandırmanızdan aşağıdaki iki satırda olduğu gibi otomatik olarak bir görünüm işleyicisini çağırır:

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

ve:

res.render('500);

Ekspres hata işleyicisini aşağıdakilerle kurduğunuzdan emin olun:

npm install --save express-error-handler

Ardından bunu app.js dosyanıza aktarın

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

Ardından, hata işlemenizi kullanmak için değiştirin:

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

0

Kodunuzda görünüm motorunu ayarlamanız yeterlidir.

var app = express(); 
app.set('view engine', 'ejs');

0

Hata: Varsayılan motor belirtilmedi ve uzantı sağlanmadı

Aynı sorunu yaşadım (ortalama bir yığın projesi yapmak için) .. sorun şu ki, npm'yi yüklemek için formattan bahsetmedim yani; pug veya jade, ejs vb. bu nedenle bu npm'yi çözmek için express --view = pug klasör adı girin. Bu, verilen klasöre gerekli pug dosyalarını (index.pug, layout.pug vb.) Yükleyecektir.


0

Ekspres oluşturucuyu kullanarak bu hatayı aldıysanız, bunu kullanarak çözdüm

express --view=ejs myapp

onun yerine

express --view=pug myapp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.