문제상황과 시도
node.js
Express에서 express ejs 레이아웃 라이브러리를 사용했기 때문에
nestjs 프레임워크와 함께 express ejs 레이아웃을 사용하고 싶었습니다.
그래서 다음과 같이 main으로 사용되는 main.ts를 작업했습니다.
express-ejs-layouts 라이브러리는 참조로 사용됩니다.
ejs를 사용하기 위한 기본 설정 외에
앱 사용 미들웨어를 통해 작동하도록 구성해야 합니다.
import { ValidationPipe } from '@nestjs/common';
import { NestExpressApplication } from '@nestjs/platform-express';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { join } from 'path';
import { ejslayouts } from 'express-ejs-layouts';
async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(
AppModule
);
app.useGlobalPipes(new ValidationPipe({transform: true}));
//express-ejs-layouts 설정
app.use(ejslayouts);
console.log('express');
app.set('layout', 'layouts/main');
//ejs 셋팅
app.useStaticAssets(join(__dirname, '..', 'views', 'public')); //static폴더를 현재폴더(dirname)에서 한칸 상위('..')에 있는 views폴더 내 public으로 지정
app.setBaseViewsDir(join(__dirname, '..', 'views')); //view폴더를 현재폴더(dirname)에서 한칸 상위('..')에 있는 views폴더로 지정
app.setViewEngine("ejs");
const PORT = process.env.PORT;
await app.listen(PORT, function (){
console.log(`서버가 ${PORT} 포트로 열렸습니다.
http://localhost:${PORT}`);
});
}
bootstrap();
그러나 다음 오류 메시지와 함께 작동하지 않았습니다.
(Nest) 28640 – Mar 6 2023 11:36:10 ERROR (ExceptionHandler) app.use()에는 미들웨어 기능이 필요합니다.
TypeError: app.use()에는 미들웨어 기능이 필요합니다.
분명히 미들웨어를 적용하는 데 문제가 있었습니다.
그래서 아래 코드의 형식을 변경했더니 문제가 해결되었습니다.
보통 express-ejs-layouts 라이브러리를 사용할 수 있게 되었습니다.
변경 전:
수입 { ejslayouts } 에서 ‘익스프레스-ejs-레이아웃’;
변경 후:
끊임없는 ejslayouts = 필요하다(‘익스프레스-ejs-레이아웃’);
완전히 변경된 코드
import { ValidationPipe } from '@nestjs/common';
import { NestExpressApplication } from '@nestjs/platform-express';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { join } from 'path';
const ejslayouts = require('express-ejs-layouts');
async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(
AppModule
);
app.useGlobalPipes(new ValidationPipe({transform: true}));
//express-ejs-layouts 설정
app.use(ejslayouts);
app.set('layout', 'layouts/main');
//ejs 셋팅
app.useStaticAssets(join(__dirname, '..', 'views', 'public')); //static폴더를 현재폴더(dirname)에서 한칸 상위('..')에 있는 views폴더 내 public으로 지정
app.setBaseViewsDir(join(__dirname, '..', 'views')); //view폴더를 현재폴더(dirname)에서 한칸 상위('..')에 있는 views폴더로 지정
app.setViewEngine("ejs");
const PORT = process.env.PORT;
await app.listen(PORT, function (){
console.log(`서버가 ${PORT} 포트로 열렸습니다.
http://localhost:${PORT}`);
});
}
bootstrap();