使用 pushState 为 Backbone SPA 配置 node express

Configure node express for Backbone SPA with pushState

我的 Express 应用有一个休息服务器和一个使用 Backbone 的 SPA。使用 # history 一切正常,即

Backbone.history.start();

如果我这样做:

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

Backbone 路由器停止工作 - Backbone 处理良好的路由(例如 #route)在成为 /route 时被发送到 Express。表达错误:

Cannot GET /route

我试过了:

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

但没有区别。

我也试过:

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

在 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,我只想在应用程序的路由中拍摄那些“#”。

我认为路由器工作正常。当您从浏览器而不是应用程序直接调用 /index.html/someroute 时,它是 "not working"。

要处理这个问题,你必须在 express

中捕获它
app.get('*', function...)

应该可以。

一定要先声明另一条路线(如/rest)否则它会在到达'/rest'之前被'*'捕获。这是因为 Express 正在使用中间件模式(提醒您可能已经知道这一点)。

希望对您有所帮助!