如何在请求新页面时使用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.get
和app.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自动照顾它。
- 在EJS模板(使用ExpressJS)中检查variables的存在的正确方法是什么?
- 如何使用mongoose诺言 – mongo
- NodeJS / Express中的“module.exports”和“exports.methods”是什么意思?
- Node.js + Express:路由与控制器
- 可以在路由中访问app.js中的全局variables?
- 如何分离Node.js和Express 4上的路线?
- 查询在使用mongoose.createConnection()与mongoose.connect()时挂起
- 如何保护MongoDB / MongoDB中的密码字段,以便在填充集合时不会在查询中返回?
- node / express:使用Forever连续运行脚本时设置NODE_ENV