오류: 기본 엔진이 지정되지 않았으며 확장 기능이 제공되지 않았습니다.
node.js와 engine을 사용하여 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');
};
보기 엔진을 사용하지 않으면 res.render 항목이 오류를 발생시킵니다.
만약 당신이 json에게 서비스를 제공하고 싶다면, 그것을 교체하세요.res.render('error', { error: err });
코드에 다음 행이 포함됩니다.
res.json({ error: err })
PS: 일반적으로 사람들은 반환된 개체에도 메시지를 가집니다.
res.status(err.status || 500);
res.json({
message: err.message,
error: err
});
뷰 엔진을 놓쳤습니다. 예를 들어, 옥을 사용하십시오.
옷을 갈아입기
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 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);
}
을 설치해야 .default engine
Express
를 기준으로 합니다.program.template
아래에서 읽을 수 있는 것처럼:
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';
은 " 기본보기엔진다같다습니음과은▁is다"입니다.jade
.res.render
합니다.next(err);
엔진을 경우에는뷰 엔진을 사용합니다.res.render
오류가 발생할 수 있습니다.
죄송합니다. 이 줄에도 주석을 달아야 합니다.
app.set('view engine', 'html');
하지만 제 솔루션은 뷰 엔진을 사용하지 않는 결과를 초래할 것입니다.뷰 엔진이 필요하지는 않지만 목표가 있다면 다음을 시도해 보십시오.
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');
너의 것을 둬라.*.html
에 시대에views
렉토또는리 serve apublic
하고 "static dir"를 입력합니다.index.html
에 시대에public
dir.dir.dir.dir.
대신에
app.get('/', (req, res) => res.render('Hellooooo'))
사용하다
app.get('/', (req, res) => res.send('Hellooooo'))
교체하십시오.
app.set('view engine', 'html');
와 함께
app.set('view engine', 'ejs');
뷰 엔진을 추종 방식으로 설정
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
코드에서 HTML 코드를 인라인으로 보내기만 하면 된다면, 아래를 사용할 수 있습니다.
var app = express();
app.get('/test.html', function (req, res) {
res.header('Content-Type', 'text/html').send("<html>my html code</html>");
});
위의 답변은 맞지만 간단한 오타로도 이 오류가 발생할 수 있다는 것을 알게 되었습니다.예를 들어 var router = express 대신 var router = express를 사용했습니다.라우터()에서 이 오류가 발생했습니다.따라서 다음과 같습니다.
// 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');
})
코드에 뷰 엔진을 설정하기만 하면 됩니다.
var app = express();
app.set('view engine', 'ejs');
익스프레스 제너레이터를 사용하여 이 오류가 발생한 경우 사용하여 해결했습니다.
express --view=ejs myapp
대신에
express --view=pug myapp
방금 이 오류 메시지를 받았는데, 문제는 제가 미들웨어를 제대로 설정하지 않았다는 것입니다.
저는 MEAN 스택에서 블로그를 구축하고 있으며 프런트 엔드에서 사용하던 .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"
}
이것이 누군가에게 도움이 되기를 바랍니다!좋은 일만 가득하시길요!
express-error-handler를 사용하여 정적 html 페이지를 오류 처리에 사용하고 보기 처리기를 정의하지 않을 수 있습니다.
이 오류는 404 또는 누락된 패비콘(이전 콘솔 메시지를 포함한 경우 표시됨)에 의해 발생했을 수 있습니다.'html'의 'view handler'가 4.x express에서 유효하지 않은 것 같습니다.
원인에 관계없이 구성의 추가 요소를 수정하는 한 (유효한) 보기 처리기를 정의하지 않을 수 있습니다.
이 문제를 해결하는 방법은 다음과 같습니다.
- 다른 답변과 같이 유효한 보기 처리기 정의
- 내용을 직접 반환하려면 렌더 대신 send()를 사용합니다.
http://expressjs.com/en/api.html#res.render
파일 경로 없이 렌더를 사용하면 구성에서 다음 두 줄과 같이 뷰 핸들러가 자동으로 호출됩니다.
res.render('404', { url: req.url });
그리고:
res.render('500);
express-error-handler를 다음과 함께 설치해야 합니다.
npm install --save express-error-handler
그런 다음 앱으로 가져옵니다.js
var ErrorHandler = require('express-error-handler');
그런 다음 오류 처리를 사용하도록 변경합니다.
// 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);
오류: 기본 엔진이 지정되지 않았으며 확장 기능이 제공되지 않았습니다.
(평균 스택 프로젝트를 수행하는 것에 대해) 같은 문제가 발생했습니다.문제는 이 문제를 해결하기 위해 오후에 가서 express --view=pug foldername을 입력하기 위해 npmi, 즉 pug 또는 jade, ejs 등을 설치하는 형식을 언급하지 않았다는 것입니다.이렇게 하면 필요한 pug 파일(index.pug, layout)이 로드됩니다.퍼그 등..)이 지정된 폴더에 있습니다.
NestJS를 사용하는 경우 이 문제를 해결하려면 main.ts 파일을 변경해야 합니다.아래의 예제를 사용하는 것을 고려해 주십시오.
import { NestFactory } from '@nestjs/core';
import { NestFastifyApplication, FastifyAdapter } from '@nestjs/platform-fastify';
import { AppModule } from './app.module';
import { join } from 'path';
async function bootstrap() {
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter(),
);
app.useStaticAssets({
root: join(__dirname, '..', 'public'),
prefix: '/public/',
});
app.setViewEngine({
engine: {
handlebars: require('handlebars'),
},
templates: join(__dirname, '..', 'views'),
});
await app.listen(3000);
}
bootstrap();
언급URL : https://stackoverflow.com/questions/23595282/error-no-default-engine-was-specified-and-no-extension-was-provided
'it-source' 카테고리의 다른 글
도커 구성 시작 "오류: 시작할 컨테이너가 없습니다" (0) | 2023.08.09 |
---|---|
원격에서 다른 원격으로 분기를 Git push branch? (0) | 2023.08.09 |
apk는 이전 버전과 동일한 인증서로 서명되어야 합니다. (0) | 2023.08.09 |
VS Code에서 통합 터미널을 별도의 창에서 열 수 있습니까? (0) | 2023.08.09 |
java.lang을 가져오는 중입니다.REST Assured를 사용하여 테스트할 때 AbstractMethodError가 발생함 (0) | 2023.08.09 |