Установить опцию «basedir» для мопса в NestJS - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь использовать 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);

Использование extends /layouts/index в представлении приведет к следующему;the "basedir" option is required to use includes and extends with "absolute" paths.

Я не собираюсь использовать относительные пути, так как это быстро становится очень грязным.Например extends ../../../layouts/index

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

Из того, что я могу сказать, вы можете достичь той же функциональности, что и /layouts/index, просто используя layout/index, пока layout является папкой в ​​вашем каталоге templates/views.

Я настроил git-репо в качестве рабочего примера, чтобы вы могли сами протестировать его и посмотреть, нужно ли мне углубляться во что-либо.

РЕДАКТИРОВАТЬ 27.06.2009:

Спасибо, я неправильно понял ваш первоначальный вопрос.

С помощью создания и экспресс-приложения вы можете отправить express server на NestFactory, чтобы использовать этот экземпляр сервера вместо того, чтобы 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.pug и message.pug файлов extends /templates/layout

1 голос
/ 28 июня 2019

Просмотрев документацию, NestJS использует экспресс под капотом и дает вам доступ к базовому экземпляру с помощью getHttpAdapter().getInstance().

Имея это в виду, мы можем установить basedir следующим образом:

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