如何在NestJS框架中正确配置使用EJS模板引擎?
NestJS 配置EJS模板引擎方案
你找不到.set()方法的核心原因是:默认创建的Nest应用实例是通用类型,不包含Express平台的扩展方法,只要给实例指定Express平台对应的类型,就可以直接使用和原生Express一致的API配置模板引擎。
步骤1:安装依赖
默认Nest项目基于Express平台,只需要安装ejs包即可:
npm install ejs
步骤2:修改入口文件配置
在main.ts中引入Express平台对应的应用类型,创建实例时指定泛型,再完成模板引擎配置:
import { NestFactory } from '@nestjs/core'; import { NestExpressApplication } from '@nestjs/platform-express'; import { AppModule } from './app.module'; import { join } from 'path'; async function bootstrap() { // 指定实例类型为NestExpressApplication,即可获取Express平台的所有扩展方法 const app = await NestFactory.create<NestExpressApplication>(AppModule); // 可选:配置静态资源目录,存放css、js、图片等静态文件 app.useStaticAssets(join(__dirname, '..', 'public')); // 配置ejs模板文件的存放目录 app.setBaseViewsDir(join(__dirname, '..', 'views')); // 设置模板引擎为ejs,和原生Express写法完全一致 app.setViewEngine('ejs'); await app.listen(3000); } bootstrap();
步骤3:编写模板与路由渲染
- 在项目根目录新建
views文件夹,所有.ejs后缀的模板文件都放在这个目录下,比如新建index.ejs:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title><%= title %></title> </head> <body> <h1><%= content %></h1> </body> </html>
- 在Controller中使用
@Render()装饰器指定要渲染的模板,方法返回值会作为模板变量传入:
import { Controller, Get, Render } from '@nestjs/common'; @Controller() export class AppController { @Get() @Render('index') // 对应views/index.ejs,无需写文件后缀 getHomePage() { return { title: 'NestJS EJS测试页', content: 'EJS模板在NestJS中配置成功' }; } }
额外配置说明
- 如果需要自定义EJS的配置项,比如修改分隔符、开启渲染缓存,可以通过
app.set('view options', { delimiter: '?', cache: true })传入,和原生Express配置逻辑完全一致 - 如果你使用Fastify作为底层HTTP平台,上述配置不适用,需要安装
@fastify/view插件完成注册,默认初始化的Nest项目均为Express平台,直接使用以上方案即可
内容的提问来源于stack exchange,提问作者Alessandro Rhomberg
相关产品推荐
相关产品推荐

