предположим приложение у нас состоит из back и front папочек, которые компилятся в /dist/*
let root = process.cwd();
let nodeModules = '/node_modules/';
let clientFiles = '/dist/front';
application.use(express.static(path.join(_root , nodeModules)));
// настраиваем express, указывая ссылку на папку с билдом фронтенда вот так
application.use(express.static(path.join(_root , clientFiles)));
// теперь экспресс будет знать где искать статику, т.е. наш front + node_modules папку
// конфигурим API роутер,
router = express.Router();
router
.route('/todos')
.get(TodoController.getAll)
.post(TodoController.createTodo);
// прячем все вызовы к api в отдельную ветку
application.use('/api', router);
// API ошибки будем обрабатывать своим JSON ответом
application.use('/api', function (error: any, req: express.Request, res: express.Response, next: express.NextFunction){
res.status(statusCode).json({error});
});
application.all('*', (req: any, res: any) => { // все остальное отправляем в dist/front/index.html/angularRoute
res.status(200).sendFile(path.join(root, clientFiles, '/index.html'));
});
Прикол в том что ваше api не знает ваших front-овых роутов.
Поэтому когда в express попадает роут: '/users/1' и он его не находит, он отправляет его в index.html => index.html/users/1 , теперь ангуляр смотрит есть ли у него такой роут, и если нет, то тогда рисует страницу с ошибкой.
Однако api это чисто back-ендовские роуты, соответственно для этой ветки, мы эррор хендлер повесили.