NestJS поставляет статические файлы на основе языка браузера - PullRequest
2 голосов
/ 07 мая 2019

Nestjs должен доставить приложение Angular на основе языка, определенного в браузере.

Приложение Angular находится на dist/public/en или dist/public/de.

Если пользователь обращается к / через английский браузер, nestjs должен доставлять файлы из папки dist/public/en. В этом случае путь в браузере должен указывать на fqdn/en/.

Я уже использую это с одноязычным приложением Angular:

async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);

  app.useStaticAssets(join(__dirname, 'public'));
  await app.listen(process.env.PORT || 3000);
}
bootstrap();

Я также заглянул в i18следующий , который выглядит многообещающе.

Но я не совсем уверен, что это правильное направление.

Любой отзыв тепло приветствуется.

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Лучше, чем статически обслуживать вашу папку dist, было бы перенаправить все не-api маршруты на index.html, чтобы ваш Angular SPA мог позаботиться о маршрутизации. См. этот ответ для более подробной информации.


Вы можете адаптировать промежуточное программное обеспечение из приведенного выше связанного ответа, принимая во внимание факторы, с помощью которых вы хотите определить язык пользователя, например, заголовок ACCEPT-LANGUAGE или определенный файл cookie:

@Middleware()
export class FrontendMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: Function) {
    // Some way of detecting the user's language
    const languages = req.header('ACCEPT-LANGUAGE') || 'en-US';

    if (languages.contains('de-DE')) {
      res.sendFile(join(__dirname, 'public', 'de' ,'index.html'));
    } else {
      res.sendFile(join(__dirname, 'public', 'en', 'index.html'));
    }
  }
}
0 голосов
/ 09 мая 2019

@ Ким-Керн большое спасибо за ваш ответ. Это подтолкнуло меня в правильном направлении.

Я решил проблему следующим образом: maint.ts определяет язык на основе глобального промежуточного программного обеспечения и определяет статическую доставку файлов:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as compression from 'compression';
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
const i18next = require('i18next');
const middleware = require('i18next-express-middleware');

async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);

  i18next.use(middleware.LanguageDetector).init({
    detection: {
      order: ['path', 'session', 'querystring', 'cookie', 'header'],
    },
  });

  app.use(
    middleware.handle(i18next, {
      ignoreRoutes: ['/api'],
      removeLngFromUrl: false,
    }),
  );

  app.useStaticAssets(join(__dirname, 'public'));
  app.use(compression());
  await app.listen(process.env.PORT || 3000);
}
bootstrap();

Я определил пользовательское промежуточное ПО, которое проверяет найденный язык и на основе baseUrl выдает правильный файл index.html:

import { NestMiddleware, Injectable } from '@nestjs/common';
import { Request, Response } from 'express';
import { join } from 'path';

@Injectable()
export class FrontendMiddleware implements NestMiddleware {
  use(req: any, res: Response, next: Function) {
    if (req.lng && !req.baseUrl && req.lng.startsWith('de')) {
      res.sendFile(join(__dirname, 'public', 'de', 'index.html'));
    } else if (!req.baseUrl) {
      res.sendFile(join(__dirname, 'public', 'en', 'index.html'));
    } else {
      next();
    }
  }
}

Затем в app.module.ts включается пользовательское промежуточное ПО:

...
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer): void {
    consumer.apply(FrontendMiddleware).forRoutes({
      path: '/**',
      method: RequestMethod.ALL,
    });
  }
}

Единственная проблема, которая открыта, заключается в том, что теперь он пытается доставлять файлы всегда из фиксированной общедоступной директории, которая завершается неудачно, если выполняется в режиме разработки, а не в рабочем режиме.

Я буду искать там решение для него.

...