我正在使用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中路由视图。这样做的最佳方式是什么?
答案 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提供角度所需的静态资源。