Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use vuejs routing with history fallback and expressjs routes

I've been stuck on this for a number of weeks and I can't figure it out. It's driving me crazy... Ive read numerous tutorials and it sounds like it's something that should work!

I have an expressjs server setup and a vuejs app. I want to be able to serve the vuejs routes with history browser mode and I also want to be able to setup server side routes for my api layer.

If I disable the history mode, everything works ok - but I need to enable history mode, so that I can use auth0 library and callbacks. Callbacks do not allow # in the url.

Here is my code:

const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const logger = require('morgan');
const history = require('connect-history-api-fallback');

const app = express();

app.use(require('connect-history-api-fallback')())
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(history({
  verbose: true
}));

app.get('/api', (req, res) => res.send('Hello World!'))
app.use('/', express.static(path.join(__dirname, 'dist')));

var port = process.env.PORT || 8080;
app.listen(port);
console.log('server started '+ port);

For the code above, the vuejs app is sitting under /dist and all the routes for that one work. But when I try to hit /api - it is also being redirected to the vuejs app.

Any help would be greatly appreciated! I'm at the point where I'm thinking its just not possible.

like image 720
jrutter Avatar asked Feb 12 '18 11:02

jrutter


People also ask

What is history mode in vue router?

The default mode for vue-router is hash mode - it uses the URL hash to simulate a full URL so that the page won't be reloaded when the URL changes. To get rid of the hash, we can use the router's history mode, which leverages the history.

How do I use vue routing?

Step 1: Vue Router can be installed through Npm with the package named vue-router using below command. It can be used via a script tag as shown below. Step 2: Create our Vue project using the following command. Step 3: After creating our project we will add our Vue router using the following command.

How do I create a dynamic route vue?

Adding dynamic routes in VueUpdate the router/index. js file with the new route in the routes array. Remember to include the import for the Post component. Restart your app and head to localhost:8080/post/dynamic-routing in your browser.

Is vue router 4 compatible with vue2?

It's not possible to use vue-router@4 with vue@2 . They're incompatible with each other.


1 Answers

I was having the same issue. I fixed it by adding app.use(history()) after my api routes, but before app.use('/', express.static(path.join(__dirname, 'dist')));.

So I think for you it'd be like

const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const logger = require('morgan');
const history = require('connect-history-api-fallback');

const app = express();

app.use(logger('dev'));
app.use(bodyParser.json());

app.get('/api', (req, res) => res.send('Hello World!'));
app.use(history({
  verbose: true
}));
app.use('/', express.static(path.join(__dirname, 'dist')));

var port = process.env.PORT || 8080;
app.listen(port);
console.log('server started '+ port);

This answer helped me: https://forum.vuejs.org/t/how-to-handle-vue-routes-with-express-ones/23522/2

like image 116
samwarnick Avatar answered Oct 11 '22 02:10

samwarnick