1

我是 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的配置有关(以前没遇到过这个问题)?

提前谢谢了!

4

0 回答 0