AngularJS,ExpressJS和Mongoose

时间:2013-06-24 15:29:37

标签: angularjs mongodb express mongoose

我已经成功创建了一个api,它将JSON数据发送到我的AngularJS应用程序。后端从Mongodb读取数据(使用Mongoose包)。索引方法就像一个魅力(我使用jsonp,因为我的测试环境是一个服务器,后端和前端在不同的端口上运行)

exports.index = function (req, res){
    return ContactModel.find(function (err, contacts) {
        if (!err) {
            return res.jsonp(contacts);
        } else {
                return console.log(err);
        }
    });
}

AngularJS部分如下所示:

$http({method: 'jsonp', url: 'http://host:1222/contacts?callback=JSON_CALLBACK'}).success(function(data, status, headers, config) {
    $scope.contacts = data;
});

稍后,我可以愉快地访问这些数据(例如 {{contact.name}}

问题在于,当我尝试仅查看一个结果时,使用 findById

exports.findById = function (req, res) {
    return ContactModel.findById(req.params.id, function (err, contact) {
      if (!err) {
            return res.jsonp(contact);
      } else {
        return console.log(err);
      }
    });
}

我的AngularJS ViewController看起来像这样:

function ViewController($scope, $http) {
    $http({method: 'jsonp', url: 'http://host:1222/contacts/:id?callback=JSON_CALLBACK'}).success(function(data, status, headers, config) {
      console.log("Data: " +data);
      $scope.contact = data;
    });
}

它由以下人员调用:

<a href="#/contacts/{{ contact._id }}">{{ contact.name }}</a>

但是,我一直收到的错误是:

{ message: 'Cast to ObjectId failed for value ":id" at path "_id"',
  name: 'CastError',
  type: 'ObjectId',
  value: ':id',
  path: '_id' }

以下是数据库中的示例:

JSON_CALLBACK && JSON_CALLBACK([
  {
    "name": "Test User",
    "_id": "51c5fde3ce36618e0c000003",
    "__v": 0
  }
]);

我已经阅读了很多关于“Cast to ObjectId失败的文章”的文章:id“at path”_id“”问题,但我不明白......我是否需要创建自己的ID查找?在这种情况下,我必须引入一个auto_increment唯一ID-ing模式,不推荐用于MongoDB,因此,请您告诉我为了能够以正确的方式查询数据我必须做些什么?另外,如果你看到我目前在AngularJS方面的实现有任何问题,请告诉我(我是这个主题的新手。)。

更新

这是我使用AngularJS进行路由的方式:

  angular.module('contactmanager', ['filters']).
        config(function($routeProvider) {
          $routeProvider.
            when('/', {controller:ListController, templateUrl:'list.html'}).
            when('/contacts/:id', {controller:ViewController, templateUrl:'contact.html'}).
            otherwise({redirectTo:'/'});
        });

更新2

服务器端路由 - 表示:

var express = require("express");
var contacts = require("./contact");
var app = express();

app.get("/", contacts.index);
app.get('/contacts', contacts.index);
app.get('/contacts/:id', contacts.findById);
app.listen(1222);

我认为这里缺少一些东西......?

1 个答案:

答案 0 :(得分:2)

我认为消息是服务器端的mongo?

该消息表示_id的:id而非51c5fde3ce36618e0c000003,当然:id字符串不是有效的ObjectId

编辑:所以上面的说法是正确的,在你的控制器中你的ajax调用正在点击这个url:http://host:1222/contacts/:id?callback=JSON_CALLBACK你的:id没有参数化,它的硬编码并作为一个值传递。

您需要使用$routeParams来解释它的值:

function ViewController($scope, $http, $routeParams) {
    var ajax_url = 'http://host:1222/contacts/' + $routeParams.id + '?callback=JSON_CALLBACK';
    $http({method: 'jsonp', url: ajax_url}).success(function(data, status, headers, config) {
      console.log("Data: " +data);
      $scope.contact = data;
    });
}