我是 AngularJS 的菜鸟,并尝试设置一个简单的 web 应用程序来测试框架是否满足我们的需求。我已阅读 API 参考并完成了教程。不幸的是,在 $resource 上设置和处理路径和位置的方式并没有很好地解释。
我面临的问题是,当我按照教程中的描述为 $resource 提供相对路径时,我总是得到 404。
这是我的设置:
我已经克隆了AngularJS 电话猫应用程序并扔掉了他们的电话东西,但利用他们的结构引入了我自己的逻辑。我的 index.html 如下所示:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>testapp</title>
<link rel="stylesheet" href="css/bootstrap.css">
<script src="lib/angular/angular.js"></script>
<script src="lib/angular/angular-resource.js"></script>
<script src="js/app.js"></script>
<script src="js/controllers.js"></script>
<script src="js/filters.js"></script>
<script src="js/services.js"></script>
</head>
<body ng-app="testapp">
<div class="navbar">
<div class="navbar-inner">
<a class="brand" href="#">Testapp using AngularJS</a>
</div>
</div>
<div ng-view></div>
</body>
第一个问题是 AngularJS 似乎没有就如何对 RESTful API 进行 oauth 提供任何建议,而且他们的教程只给出了服务器提供硬编码 JSON 的“梦想场景”,所以我侵入了他们的网络服务器.js 以便让 node.js 服务器处理 API 调用并返回结果 JSON。对于 oauth,我成功地做到了,但对于进一步的 API 调用,它不起作用。
这是我的黑客:
StaticServlet.prototype.handleRequest = function(req, res) {
var self = this;
var path = ('./' + req.url.pathname).replace('//','/').replace(/%(..)/g, function(match, hex){
return String.fromCharCode(parseInt(hex, 16));
});
var parts = path.split('/');
if (parts[parts.length-1].charAt(0) === '.')
return self.sendForbidden_(req, res, path);
/* Hack for RESTful API calls. */
var post = '';
var query = qs.parse(req.url);
if (req.method === 'POST') {
var body = '';
req.on('data', function(data) {
body += data;
});
req.on('end', function () {
post = JSON.parse(body);
console.log(post);
// method name is part of the parameters
// apiRequests is the module handling the API requests
apiRequests[post.method](post, res);
});
} else if (query.api === 'api') {
var query = qs.parse(queryString);
// method name is part of the parameters
// apiRequests is the module handling the API requests
apiRequests[query.method](queryString, res);
} else {
fs.stat(path, function(err, stat) {
if (err)
return self.sendMissing_(req, res, path);
if (stat.isDirectory())
return self.sendDirectory_(req, res, path);
return self.sendFile_(req, res, path);
});
}
}
这真的只是一个丑陋的黑客,但无论如何。登录 POST 请求委托给 oauth 调用,api GET 请求委托给适当的 api 请求方法,其余的处理方式与 web-server.js 之前的处理方式相同。
问题是,handleRequest 方法永远不会被调用。
这是我拨打电话的客户端服务代码:
return {
fetchCommunications : function ($scope) {
var parameters = {
'api': 'api',
'method': 'communications',
'bearer':userData["access_token"],
'chiffre':userData["chiffre"]
}
var resource = {
r : $resource('communications', {}, {
query: {method:'GET', params:parameters}
})
}
var d = resource.r.query();
console.log("Communications: " + d);
return d;
}
这是来自服务器控制台的错误消息:
GET /app/communications?api=api&bearer=d6a348ea-0fe5-46fb-9b5e-13d3343c368d&chiffre=0000006F&method=communications Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22
404 Not Found: /app/communications
这正是我期望被调用的路径 - 但为什么是 404?
我可以通过像这样配置 $resource 来避免 404:
var resource = {
r : $resource('index.html#/communications', {}, {
query: {method:'GET', params:parameters}
})
这也不起作用,因为哈希之后的所有内容都从路径中省略了。此外,为什么我需要在路径中有 index.html ?
我觉得我在这里遗漏了一些非常明显的东西,因此正在做一些非常愚蠢的事情。有任何想法的人吗?是不是和node.js的配置有关(以前没遇到过这个问题)?
提前谢谢了!