4

本质上,当我使用包罗万象的路线并使用res.redirect('/')不管我输入的网址时,它总是会呈现索引/主页(即 Angular 似乎没有“看到”完整的网址)但是如果我放置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: '/'});
});

这将在输入时正确呈现 about 页面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

4 回答 4

3

这是设计使然。

当您使用 时res.redirect('/'),Node/Express 正在发送一个 HTTP 重定向,这将更改浏览器中的 URL,因此当您的索引模板被呈现时,并且当 Angular 代码运行时,URL 是/,无论用户输入什么(重定向的全部要点)。

当您省略重定向并仅将模板作为响应发送时,NodeJs 会以 HTTP 200(成功)和 HTML 内容进行响应。由于 URL 没有更改,因此当您的应用程序运行时,角度路由会正确路由。

编辑添加:地址评论

与其让两个路由渲染同一个模板,我会一起摆脱/路由,只让包罗万象的渲染索引模板,然后将控制权交给 Angular 路由器。

否则,我会考虑从概念上拆分您的路由:您的所有应用程序路由都专门发送到角度路由器,并且您通过 nodejs 呈现静态路由,并使用您的全部捕获为丢失或未知的资源呈现更合适的页面(对您的用户)。

您可以使用类似正则表达式的语言来指定单个处理程序:

app.get('/()|(about)|(contact)/',function(req,res) {/* handle */});
于 2013-10-14T23:07:55.217 回答
3

对于文件夹结构:

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');
});
于 2015-08-31T22:57:18.187 回答
1

我有一个问题,当我使用包罗万象的路由时,我的所有静态资产(样式表、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 文件。但是,当它在那里时,表达抓住资产。

于 2013-10-29T07:34:13.927 回答
0

$locationProvider.html5Mode(true); 您确定您的请求正在访问 nodejs 服务器吗?使用这种方式,angularjs 将尝试在浏览器中搜索 urlmapping。

尝试通过评论 $locationProvider.html5Mode(true);

于 2014-02-04T14:16:16.700 回答