Как я могу обслуживать свой внешний интерфейс Angular через сервер Nodejs / Nestjs, развернутый на Heroku? - PullRequest
0 голосов
/ 07 июля 2019

У меня есть API-интерфейс NestJS, который я хочу использовать для обслуживания внешнего интерфейса Angular.Это развернуто на героку.Для внутренних маршрутов используйте префикс «/ api», и я хочу, чтобы все другие запросы отвечали index.html из моего приложения Angular сборки.

Моя структура папок для развернутого приложения:

-dist
  -client
    -index.html
    -.js files
  -server
    -main.js
    -other dirs/modules

Я пробовал все до сих пор, и все они работали локально.Проблема развертывания к героку.Самое близкое, что я получил (с помощью этой статьи: https://medium.com/@bo.vandersteene/use-nest-as-your-server-side-application-with-an-angular-frontend-540b0365bfa3) создает промежуточное программное обеспечение внешнего интерфейса в приложении NestJS, которое просматривает путь запроса и расширения файлов, а затем использует res.sendFile и path.resolve для созданияfilepath для ответа.

import { Injectable, NestMiddleware } from '@nestjs/common';
import { apiPrefix } from '../../config';
import { Request, Response } from 'express';
import { resolve } from 'path';

const allowedExtentions = [
  '.js',
  '.ico',
  '.css',
  '.png',
  '.jpg',
  '.woff2',
  '.woff',
  '.ttf',
  '.svg',
];

const prefix = apiPrefix;

@Injectable()
export class FrontendMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: () => void) {
    const { baseUrl } = req;
    if (baseUrl.indexOf(prefix) === 0) {
      next();
    } else if (
      allowedExtentions.filter(extention => baseUrl.indexOf(extention) > 0)
        .length > 0
    ) {
      res.sendFile(resolve(`./dist/client/${baseUrl}`));
    } else {
      res.sendFile(resolve('./dist/client/index.html'));
    }
  }
}

Это работает ЛОКАЛЬНО. При развертывании на heroku я получаю сообщение об ошибке: [ExceptionsHandler] ENOENT: no such file or directory, stat '/app/dist/client/index.html' Однако это не имеет смысла, поскольку при входе в систему Heroku bash для моего проектаЯ могу видеть точный путь к файлу и файл. Файл существует, но по какой-то причине NestJS не распознает его.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 07 июля 2019

То, что я сделал с большим успехом, находится в вашем файле main.ts, добавьте app.useStaticAssets('your/path/to/dist/client') и затем на вашем маршруте GET / вы отправите файл index.html. например


@Injectable()
export class AppController {
  @Get()
  sendApplication(@Res() res) {
    res.sendFile('index.html');
  }
}

Я должен отметить, что для этого необходимо, чтобы ваше угловое приложение было собрано с использованием ng build --prod на этапе Heroku build или перед тем, как код попадет в Heroku.

...