TIL : nestjs 에서

문제상황과 시도

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