基本上当我使用catch-all路由并使用res.redirect('/')
而不管我输入的url时,它总是呈现索引/主页(即Angular似乎没有'看到'完整的url)但是如果我将res.render('index')
置于全能路线中,一切正常。我不想重复代码并重定向到'/'应该工作,我可能在这里的某个地方犯了一个愚蠢的错误,任何帮助都会非常感激!
角度路由:
app.config(function ($routeProvider, $locationProvider) {
$locationProvider.html5Mode(true);
$routeProvider
.when('/',
{
templateUrl: 'partials/home.jade'
})
.when('/about',
{
templateUrl: 'partials/about.jade'
})
.otherwise( {redirectTo: '/'});
});
这将在输入site-address/about
时正确呈现关于页面:
app.get('/', function (req, res) {
res.render('index');
});
app.get('/partials/:name', function (req, res) {
res.render('partials/' + req.params.name);
});
app.get('*', function (req, res) {
res.render('index');
});
这将始终显示索引页面:
app.get('/', function (req, res) {
res.render('index');
});
app.get('/partials/:name', function (req, res) {
res.render('partials/' + req.params.name);
});
app.get('*', function (req, res) {
res.redirect('/');
});
配置是否有帮助:
// Configuration
app.configure(function () {
app.set('port', process.env.PORT || 1337);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.static(path.join(__dirname, 'public')));
app.use(app.router);
});
答案 0 :(得分:3)
这是设计的。
当您使用res.redirect('/')
时,Node / Express正在发送HTTP重定向,这将更改浏览器中的URL,因此在呈现索引模板时,以及运行角度代码时,URL为{ {1}},无论用户输入了什么(重定向的整个点)。
当您省略重定向并仅将模板作为响应发送时,NodeJs会响应HTTP 200(成功)以及HTML内容。由于URL没有更改,因此当您的应用程序运行时,角度路由正确路由。
编辑添加:地址评论
我没有让两条路由渲染相同的模板,而是将所有路径全部放在一起,只需让catch-all渲染索引模板,然后将控制权交给Angular路由器
否则,我会考虑从概念上分割您的路由:所有应用程序路由都专门发送到角度路由器,并通过nodejs呈现静态路由,并使用catch all为缺失或未知资源呈现更合适的页面(对您的用户更有帮助。)
您可以使用类似正则表达式的语言来指定单个处理程序:
/
答案 1 :(得分:2)
对于文件夹结构:
root
-web.js
-dist/index.html
-dist/rest of the page
只需将以下代码段粘贴到web.js
nodeApp.use('/', express.static(__dirname + '/dist'));
nodeApp.get('/[^\.]+$', function(req, res){
res.set('Content-Type', 'text/html')
.sendfile(__dirname + '/dist/index.html');
});
答案 2 :(得分:1)
我有一个问题,当我使用catch-all路由时,我的所有静态资产(样式表,javascript文件等)都不会加载:
app.use(app.router);
app.use(express.static(path.join(__dirname, frontend.app)));
// when this is removed, I can load static assets just fine
app.get('*', function(req, res){
res.render('main');
});
当删除app.get('*',...)部分时,我可以正常加载静态资源(即我可以输入'examplejavascript.js'并查看javascript文件。当它在那里时然而,快递抓住资产。
答案 3 :(得分:0)
$ locationProvider.html5Mode(真); 你确定你的请求是在命中nodejs服务器吗?使用这种方法,angularjs将尝试在浏览器中搜索urlmapping。
尝试评论 $ locationProvider.html5Mode(真);