使用 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 正在使用中间件模式(提醒您可能已经知道这一点)。
希望对您有所帮助!
我的 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 正在使用中间件模式(提醒您可能已经知道这一点)。
希望对您有所帮助!