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');
};
Skomentuj
res.render
wiersze w kodzie i dodajnext(err);
zamiast tego. Jeśli nie używasz silnika widoku, zawartośćres.render
wyś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.render
linii 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: {} }); });
źródło
Jeśli chcesz wyrenderować plik html, użyj:
response.sendfile('index.html');
Następnie usuwasz:
app.set('view engine', 'html');
Umieść swój
*.html
wviews
katalogu lub podajpublic
katalog jako katalog statyczny i umieść goindex.html
w katalogupublic
.źródło
response.sendfile()
jest przestarzały, użyjresponse.sendFile()
zamiast niego. Zwróć uwagę na duże „F”.ustaw silnik widoku w następujący sposób
app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade');
źródło
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>"); });
źródło
Proszę zamienić ===== app.set ('view engin', 'html'); z app.set ('view engine', 'ejs');
źródło
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!
źródło
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'); })
źródło
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:
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:
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);
źródło
Po prostu ustaw silnik widoku w swoim kodzie.
var app = express(); app.set('view engine', 'ejs');
źródło
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.
źródło
jeśli masz ten błąd przy użyciu generatora ekspresowego, rozwiązałem go za pomocą
zamiast
źródło