Настройте экспресс узла для Backbone SPA с помощью pushState - PullRequest
0 голосов
/ 06 июня 2018

Мое экспресс-приложение имеет сервер отдыха и SPA, использующий Backbone.Все работает нормально, используя # history, то есть

Backbone.history.start();

Если я сделаю:

Backbone.history.start({ pushState: true });

, то маршрутизатор Backbone перестанет работать - будет отправлен маршрут, который прекрасно обрабатывает Backbone (например, #route)Выразить, когда это становится / маршрут.Экспресс ошибки с:

Cannot GET /route

Я пытался:

Backbone.history.start({ pushState: true, root '/' });

, но без разницы.

Я также пытался:

app.use('/*', function ...

в Express- без разницы.

express server.js:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');

app.use(express.static(__dirname + '/public'));

app.get('/', function(req, res){
  res.render('index.ejs');
});

var rest = require('./routes/rest');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.use('/rest', rest);

app.listen(3000);

Маршрутизатор Backbone (немного похудел):

const Router = Backbone.Router.extend({
  routes: {
    '': Controllers.home,
    'admin(/:table)(/:id)': Controllers.admin,
    'master(/:table)(/:id)': Controllers.master
  }
});
Backbone.history.start({ pushState: true });

Мне не нужен SEO,Я просто хотел бы получить эти "#" в маршрутах приложения.

1 Ответ

0 голосов
/ 08 июня 2018

Я думаю, что роутер работает нормально.Это "не работает", когда вы звоните напрямую /index.html/someroute из браузера вместо приложения.

Чтобы справиться с этим, вы должны поймать его в экспрессе

app.get('*', function...)

должно работать.

Обязательно сначала укажите другой маршрут (например, /rest), в противном случае он будет перехвачен '*' до достижения '/rest'.Это связано с тем, что экспресс-паттерн промежуточного программного обеспечения используется (просто напоминание, что вы, возможно, уже знаете это).

Надеюсь, это поможет!

...