带有重定向的Node.js catch-all路由始终使用Angular呈现索引页,而不管url如何

时间:2013-10-14 22:58:10

标签: node.js angularjs express

基本上当我使用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);
});

4 个答案:

答案 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(真);