在 NestJS 中为 Pug 设置"basedir"选项



我正在尝试在NestJS中使用pug布局,但是当从绝对路径扩展布局时,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);

在视图中使用extends /layouts/index会引发以下结果;the "basedir" option is required to use includes and extends with "absolute" paths.

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

据我所知,只要layouttemplates/views目录中的文件夹,您就可以使用layout/index来实现与/layouts/index相同的功能。

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

编辑6/27/2019:

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

通过基于创建和快速的应用程序,您可以向NestFactory发送express server以使用该服务器实例,而不是让 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();

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

src
|-app.controller.ts
|-app.module.ts
|-app.service.ts
|-main.ts
views
|-hello
|-home.pug
|-message
|-message.pug
|-templates
|-layout.pug

我的home.pugmessage.pug文件的开头是extends /templates/layout

在浏览完文档后,NestJS在后台使用了一个表达式,并允许您使用getHttpAdapter().getInstance()访问底层实例。

记住这一点,我们可以将basedir设置如下;

const express = server.getHttpAdapter().getInstance();
express.locals.basedir = join(__dirname, 'templates');

最新更新