在 NestJS 中为 Pug 设置“basedir”选项

wou*_*_be 3 node.js pug nestjs

我正在尝试在 中使用pug布局NestJS,但是当从绝对路径扩展布局时,pug需要basedir设置该选项。

在 ExpressJS 中你会使用app.locals.basedir = ...,那么 NestJS 中的等价物是什么?

const server = await NestFactory.create<NestExpressApplication>(AppModule);
server.setViewEngine('pug');
server.setBaseViewsDir(join(__dirname, 'templates', 'views'));
await server.listen(config.server.port);
Run Code Online (Sandbox Code Playgroud)

extends /layouts/index在视图中使用会抛出以下内容;the "basedir" option is required to use includes and extends with "absolute" paths

我不想使用相对路径,因为这很快就会变得非常混乱。例如extends ../../../layouts/index

Jay*_*iel 6

据我所知,您可以实现与/layouts/index仅使用layout/indexlong as目录layout中的文件夹相同的功能templates/views

我已经设置了一个 git 存储库作为一个工作示例,以便您可以自己测试一下,看看我是否需要更深入地了解任何内容。

编辑2019 年 6 月 27 日:

谢谢,我误解了你最初的问题。

通过创建基于 Express 的应用程序,您可以发送express serverNestFactory使用该服务器实例,而不是让 Nest 为您创建一个普通实例。express server从这里您可以像平常一样进行设置并获得所需的功能。我已经修改了 git 存储库,以便能够更好地测试该场景,并相信这就是您正在寻找的。

我的main.ts

import { NestFactory } from '@nestjs/core';
import { NestExpressApplication, ExpressAdapter } from '@nestjs/platform-express';
import * as express from 'express';
import { AppModule } from './app.module';
import { join } from 'path';

async function bootstrap() {
  // Creating and setting up the express instanced server
  const server = express();
  server.locals.basedir = join(__dirname, '..', 'views');
  // Using the express server instance in the nest factory
  const app = await NestFactory.create<NestExpressApplication>(AppModule, new ExpressAdapter(server));
  app.useStaticAssets(join(__dirname, '..', 'public'));
  app.setBaseViewsDir(join(__dirname, '..', 'views'));
  app.setViewEngine('pug');
  await app.listen(3000);
}
bootstrap();

Run Code Online (Sandbox Code Playgroud)

总体来说文件夹设置是这样的

src
|-app.controller.ts
|-app.module.ts
|-app.service.ts
|-main.ts
views
|-hello
  |-home.pug
|-message
  |-message.pug
|-templates
  |-layout.pug
Run Code Online (Sandbox Code Playgroud)

home.pug我的和文件的开头message.pugextends /templates/layout