0

我创建了一个通过 url 工作的 API,基于node.js、和.express.jsmongoDBangular.js

我的 API 是这样调用的:

app.get('/api/posts/:query', api.postsQuery);

因此,如果我键入localhost:3000/api/posts/<whateverquery>,mongoDB 会将所有相关的 JSON 吐出到我的浏览器,所以这工作得很好。

但是,我正在尝试将其链接到我的 Angular 前端,这会导致问题。我希望用户能够搜索表单并让我的数据库返回正确的记录。这是我的控制器:

function indexCtrl($scope, $http, $resource) {
  $scope.itemSearch = $resource('http://localhost\\:3000/api/posts/:query', 
    {query:''}, {get:{method:'JSONP'}});

  $scope.doSearch = function(){
    $scope.posts = $scope.itemSearch.get({query:$scope.searchTerm});
    console.log($scope.posts[1]) // returns undefined
  }
}

我的问题是,当我运行时$scope.doSearch,我在 Chrome 的资源面板中看到这样的查询:在此处输入图像描述因此确实正在加载正确的数据,但它没有将自身附加到$scope.posts.

我觉得这可能是因为我需要一个回调函数;我尝试使用callback: JSON_CALLBACK,但这弄乱了我的查询/API(因为它?callback=...在调用的末尾添加了一个$resource,这会破坏查询)。

关于我可以在这里做什么以使其正常工作的任何想法?问题是缺少回调吗?也许我可以在app.get调用中添加一些正则表达式,之后:query允许任何通配符>

4

3 回答 3

2

将回调添加到您的 $resource 调用中:

$scope.doSearch = function(){
    $scope.itemSearch.get({query:$scope.searchTerm}, function(data){
        $scope.posts = data.posts;
        console.log($scope.posts[1]);
    });
};

请注意,他们使用回调的文档

var User = $resource('/user/:userId', {userId:'@id'});
User.get({userId:123}, function(u, getResponseHeaders){
    u.abc = true;
    u.$save(function(u, putResponseHeaders) {
    //u => saved user object
    //putResponseHeaders => $http header getter
    });
});
于 2013-07-09T16:17:20.407 回答
1

解决这个问题的“Angular”方法是使用$q 库作为 Promise。

function indexCtrl($scope, $resource, $q) {
  var defer = $q.defer();

  var resource = $resource('http://localhost\\:3000/api/posts/:query', {query:''}, {get:{method:'JSONP'}});

  resource.get({query:'mySearchQuery'}, defer.resolve);

  defer.promise.then(function(data) {
    $scope.posts = data;
  });
}
于 2013-07-09T16:21:41.713 回答
1

基于通过文档的外观(并且知道 AngularJS 正常异步执行所有操作),看起来下面的代码应该可以工作

$scope.doSearch = function(){
    $scope.posts = $scope.itemSearch.get({query:$scope.searchTerm}, function(){
        console.log($scope.posts[1]) // hopefully is something
    });
  }

http://docs.angularjs.org/api/ngResource .$resource

由于事情是异步完成的(以避免阻塞/等待/暂停),因此对于可能需要时间的任何事情(网络调用),通常都有回调或承诺。

于 2013-07-09T16:13:48.473 回答