I\'ve got in impasse with setting Angular routes to work with Express.
I tried to do like here Express 4, NodeJS, AngularJS routing but that did not work. The stati
I too faced a similar situation for routing through angular components using express, this is how I was able to resolve the routing issue:
Setup for my Nodejs Project:
Created an app.js file for the express server with the following contents:
var express = require('express');
var app = require('express')();
const port = 8090;
app.use(express.static('public'));
app.listen(port,()=>{console.log("App working at port : http://localhost:"+port)});
Running this loaded the Root Component only, from where I had to manually route through different pages using routerLink. If I instead tried to give the child components directly using URL I got a Cannot GET/{URL} error.
Fix:
express-http-proxy package imported asvar proxy = require('express-http-proxy'); app.use(express.static('public'));app.use('/*',proxy('http://localhost:'+port+'/*'));This fixed my issue.Apparently there is a more standard fix Refer Link
I just want to add that adding base href= helped me. I have my app statically served in express and browsing directly to routes in my angular app would cause lots of
refused to execute script because its mime type ('text/html') is not executable and strict mime type checking is enabled
errors to be throw. But adding base href fixed that and I can browse directly to my angular routes now.
When you don't pass a path to express.use(), then it defaults to /. The proceeding rule you set for * is either redundant or may not even work.
Also, since you're using html5mode, you need to explicitly set apart routes from resources so Express doesn't try to serve up your index.html file for all requests.
Try this example from Angular UI-Router on for size:
var express = require('express');
var app = express();
app.use('/js', express.static(__dirname + '/js'));
app.use('/dist', express.static(__dirname + '/../dist'));
app.use('/css', express.static(__dirname + '/css'));
app.use('/partials', express.static(__dirname + '/partials'));
app.all('/*', function(req, res, next) {
// Just send the index.html for other files to support HTML5Mode
res.sendFile('index.html', { root: __dirname });
});
app.listen(3006); //the port you want to use
While the solution suggested by @kirgol of using base href= works fine, there is an alternative solution which might interest someone looking for simple route serve. In this solution we will not using ExpressJS routing
Simply use this
app.use(express.static(__dirname + '/app'));
instead of this
app.all('/*', function(req, res, next) {
// Just send the index.html for other files to support HTML5Mode
res.sendFile('index.html', { root: __dirname });
});
This way expressJS will automatically serve the index.html present at that static location & will handle the routing automatically. It will behave just like a simple http server. The moment you handle the routing using app.all/ app.get - you will have to set base href to tell $locationProvider of location from which it can match routes
Thanks everybody for help. I resolved the question by inserting <base href="/" /> into head section of my Angular index.html. It worked for me, but as of now it's like magic and cargo coding, since I don't understand why it works :)
Found solution here: AngularJS: how to enable $locationProvider.html5Mode with deeplinking