如何在请求新页面时使用Express(Node.js)来使用AngularJS路由?

我正在使用Express,它从静态目录加载AngularJS。 通常情况下,我会请求http://localhost/ ,其中Express服务于我的index.html和所有正确的Angular文件等。在我的Angular应用程序中,我有这些路由设置,它将以ng-view

 $routeProvider.when('/', { templateUrl: '/partials/main.html', controller: MainCtrl, }); $routeProvider.when('/project/:projectId', { templateUrl: '/partials/project.html', controller: ProjectCtrl, }); $locationProvider.html5Mode(true); 

在我的主页上,我有一个链接到<a href="/project/{{project.id}}"> ,将成功加载模板,并指示我到http://localhost/project/3或任何ID我已经指定。 问题是当我尝试将浏览器导向到http://localhost/project/3或刷新页面时,请求将发送到Express / Node服务器,该服务器返回Cannot GET /project/3

如何设置我的快速路线以适应此? 我猜这将需要在Angular中使用$location (尽pipe我宁愿避免使用丑陋的search和#hashes),但我对如何设置Express路由来处理这个。

谢谢。

我会创build一个catch-all处理程序,它会发送必要数据的常规路由之后运行。

 app = express(); // your normal configuration like `app.use(express.bodyParser());` here // ... app.use(app.router); app.use(function(req, res) { // Use res.sendfile, as it streams instead of reading the file into memory. res.sendfile(__dirname + '/public/index.html'); }); 

app.router是运行所有Express路线(如app.getapp.post )的中间件; 通常情况下,Express会自动将它放在中间件链的最后,但是您也可以将其明确地添加到链中,就像我们在这里所做的那样。

然后,如果URL没有被app.router处理,那么最后的中间件会把Angular HTML视图发送给客户端。 这将发生任何 URL不是由其他中间件处理,所以你的Angular应用程序将不得不正确处理无效路由。

与快递4,你可能想要捕获所有的请求,并redirect到angularjs index.html页面。 app.use(app.router); 不再存在, res.sendfile不推荐使用,用res.sendFile和大写的F。

 app.post('/projects/', projectController.createProject); app.get('/projects/:id', projectController.getProject); app.get('*', function (req, res) { res.sendFile('/public/index.html'); }); 

把所有的API路由放在每个path的路由之前app.get('*', function (req, res){...}

我想我应该澄清,我没有兴趣使用模板引擎,但有Angular拉动所有的HTML partials自己,节点是完全作为一个静态服务器在这里(但它不会为JSON API。Brian Ford在这里展示了如何使用Jade: http : //briantford.com/blog/angular-express.html

我的应用程序是一个单页面的应用程序,所以我为每个可能的URL模式创build了一个Express路由,并且每个都执行相同的操作。

 fs.readFile(__dirname + '/public/index.html', 'utf8', function(err, content) { res.send(content); }); 

我假设我将不得不通过一些请求variablesAngular,但它看起来像Angular自动照顾它。