我已经成功创建了一个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);
我认为这里缺少一些东西......?
答案 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;
});
}