使用NodeJS和AngularJS路由问题

时间:2014-05-21 19:25:53

标签: node.js angularjs express

我正在使用NodeJS& amp; ExpressJS用于后端和AngularJS前端。我的所有前端路由都按照我的要求运行,但我无法弄清楚如何正确配置Node后端,以便在特定URL输入地址栏时,Node每次只渲染相同的Angular应用程序。

例如,如果我使用<a href="/about">About</a>作为Angular中我的about页面的链接,那么正确的视图将呈现,地址栏将显示localhost:8080/about。但是,如果我只是手动输入localhost:8080/about,则Node会以Cannot GET /about进行响应。现在我明白这是因为我的后端目前只处理以下事项:

var express = require('express');
var crypto = require('crypto');
var app = express();


app.set('views', __dirname + '/public');
app.engine('html', require('ejs').renderFile);
app.use(express.static(__dirname + '/public'));

app.get('/', function(req, res){
    res.render('index.html');
});

// API
app.get('/api/sync', function(req, res){
    // Here we generate a 32 byte string and make it the key
    var num = Math.floor(Math.random()*100);
    var key = crypto.createHash('md5').update(num.toString()).digest('hex');
    key = key.slice(0, key.length/2);

    console.log('Created key: ' + key);
    res.send(key);
});

var server = app.listen(8080, function(){
    console.log('Listening on port %d', server.address().port);
});

所以我想做的就是让它如此请求Node呈现相同的index.html页面,然后根据URL正确地在Angular中路由视图。这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:2)

我刚刚意识到使用:

app.get('*', function(req, res){
    res.render('index.html');
});

在我想先捕获的所有其他路线之后放置它会起作用。

答案 1 :(得分:1)

由于我还没有足够的声誉而只是添加评论,因此值得注意的是,如果您不使用服务器,res.render()将无法工作 - 侧模板渲染引擎(因为您正在使用EJS)。如果您只是提供静态HTML和Angular页面并且在Angular中设置了所有路由,那么您会想要使用res.sendFile()之类的东西。

app.get( '*', function( req, res ) {
    res.sendFile( __dirname + '/public/index.html' );
} );

答案 2 :(得分:0)

处理后端的角度应用和后端路由中的角度路由的最佳方法。

角/的前端

 sampleApp.config(['$routeProvider',
 function($routeProvider) {
   $routeProvider.
    when('/', {
    templateUrl: 'templates/home.html',
    controller: 'MainController'
   }).
   when('/about', {
    templateUrl: 'templates/about.html',
    controller: 'AboutController'
   }).


   // >>> redirect other routes to
   otherwise({
    redirectTo: '/'
   });

}]);

<强>后端: 对于渲染静态html,你不需要app.get(...) 简单将index.html放入

public/index.html 

并表达为html。其他不存在的页面(路线)返回404错误,它是正确的

在这种情况下,API完全独立且独立且有角度的完全单页应用。 Express提供角度所需的静态资源。