Błąd: nie określono mechanizmu domyślnego i nie podano rozszerzenia


136

Pracuję nad konfiguracją serwera http przy użyciu node.js i silnika. Jednak ciągle napotykam problemy, które mam mało informacji, jak rozwiązać. Byłbym wdzięczny za pomoc w rozwiązaniu tego, proszę.

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)

Poniżej przedstawiam co ustawiłem aby odpalić ten silnik.

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

Odpowiedzi:


125

Treść res.render spowoduje wyświetlenie błędu, jeśli nie używasz silnika widoku.

Jeśli chcesz tylko obsługiwać json, zamień res.render('error', { error: err });wiersze w kodzie na:

res.json({ error: err })

PS: Ludzie zwykle mają również wiadomość w zwracanym obiekcie:

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

105

Brakuje Ci silnika widoku, na przykład użyj jade :

Zmień swoje

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

z

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

Jeśli chcesz użyć przyjaznej składni HTML, użyj zamiast tego ejs

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

EDYTOWAĆ

Jak można przeczytać w module 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);
}

Musisz mieć zainstalowany plik default engine

Expresswyszukaj domyślny widok układu według, program.templatejak możesz przeczytać poniżej:

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;

      }
    });

i jak możesz przeczytać poniżej:

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

domyślnym aparatem widoku jest jade


2
Cześć, czy możesz dalej wyjaśnić, jak to działa? Zacząłem czytać w node.js, myśląc, że to wszystko, czego potrzebowałem, ale kiedy nadal nie mogłem wyświetlić moich stron, sprawdziłem dlaczego i przeszedłem do informacji o ekspresie. Teraz śledziłem informacje na stronie Express 4.2 i napotkałem błąd, powyżej którego pomogłeś. Teraz mam wytrysk i nadal nie wydaje mi się, żeby to było wszystko, czego potrzebuję. Czy możesz mi podać, jak to powinno działać?
Kobojunkie


Myślałem, że przeczytałem, że musisz wyraźnie zdefiniować silnik widoku, nawet jeśli jesteś widokiem renderującym notatki. tak jednak nie jest.
stevejpurves

16

Skomentuj res.renderwiersze w kodzie i dodaj next(err);zamiast tego. Jeśli nie używasz silnika widoku, zawartość res.renderwyświetli błąd.

Przepraszamy, musisz również skomentować tę linię:

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

Moje rozwiązanie spowodowałoby jednak, że nie używałbym silnika widoku. Nie potrzebujesz mechanizmu wyświetlania, ale jeśli taki jest cel, spróbuj tego:

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

Będziesz potrzebować res.renderlinii również podczas korzystania z silnika widoku. Coś takiego:

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

13

Jeśli chcesz wyrenderować plik html, użyj:

response.sendfile('index.html');

Następnie usuwasz:

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

Umieść swój *.htmlw viewskatalogu lub podaj publickatalog jako katalog statyczny i umieść go index.htmlw katalogu public.


4
response.sendfile()jest przestarzały, użyj response.sendFile()zamiast niego. Zwróć uwagę na duże „F”.
Pramesh Bajracharya

6

ustaw silnik widoku w następujący sposób

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

4

Jeśli wszystko, co jest potrzebne, to wysłanie kodu HTML w kodzie, możemy użyć poniżej

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

1

Proszę zamienić ===== app.set ('view engin', 'html'); z app.set ('view engine', 'ejs');


0

Właśnie dostałem ten komunikat o błędzie, a problem polegał na tym, że nie konfigurowałem poprawnie oprogramowania pośredniego.

Buduję bloga na stosie MEAN i potrzebowałem analizy treści plików .jade, których używałem po stronie front-endu. Oto fragment kodu z mojego pliku „ /middleware/index.js ” z mojego projektu.

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

Tutaj jest również mój plik „ package.json ”, możesz używać różnych wersji technologii. Uwaga: ponieważ nie jestem pewien zależności między nimi, dołączam tutaj cały plik:

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

Mam nadzieję, że to komuś pomoże! Wszystkiego najlepszego!


0

Powyższe odpowiedzi są poprawne, ale stwierdziłem, że zwykła literówka również może wygenerować ten błąd. Na przykład miałem var router = express () zamiast var router = express.Router () i otrzymałem ten błąd. Powinno więc wyglądać następująco:

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

Możesz użyć express-error-handler, aby użyć statycznych stron html do obsługi błędów i uniknąć definiowania modułu obsługi widoku.

Błąd został prawdopodobnie spowodowany przez 404, być może brakującą ikonę ulubionych (widoczna, jeśli dołączyłeś poprzedni komunikat konsoli). „Procedura obsługi widoku” „html” nie wydaje się działać w ekspresie 4.x.

Bez względu na przyczynę możesz uniknąć definiowania (prawidłowego) modułu obsługi widoku, o ile zmodyfikujesz dodatkowe elementy konfiguracji.

Dostępne opcje rozwiązania tego problemu to:

  • Zdefiniuj prawidłową procedurę obsługi widoku, tak jak w innych odpowiedziach
  • Użyj send () zamiast render, aby bezpośrednio zwrócić zawartość

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

Użycie renderowania bez ścieżki do pliku automatycznie wywołuje procedurę obsługi widoku, tak jak w przypadku następujących dwóch wierszy z konfiguracji:

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

i:

res.render('500);

Upewnij się, że zainstalowałeś express-error-handler z:

npm install --save express-error-handler

Następnie zaimportuj go do pliku app.js

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

Następnie zmień obsługę błędów na:

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

Po prostu ustaw silnik widoku w swoim kodzie.

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

0

Błąd: nie określono mechanizmu domyślnego i nie podano rozszerzenia

Mam ten sam problem (do wykonania projektu ze średnim stosem) .. Problem polega na tym, że nie wspomniałem o formatacie do zainstalowania npm ie; pug lub jade, ejs itp., więc aby rozwiązać ten problem, przejdź do npm i wprowadź express --view = pug foldername. Spowoduje to załadowanie niezbędnych plików pug (index.pug, layout.pug itp.) Do podanego folderu.


0

jeśli masz ten błąd przy użyciu generatora ekspresowego, rozwiązałem go za pomocą

express --view=ejs myapp

zamiast

express --view=pug myapp
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.