2013-06-24 6 views
0

J'ai réussi à créer une API qui envoie des données JSON à mon application AngularJS. Le backend lit les données de Mongodb (en utilisant le paquet Mongoose). La méthode d'indexation fonctionne comme un charme (j'utilise jsonp comme mon environnement de test est un serveur, avec le back-end & frontend en cours d'exécution sur des ports différents)AngularJS, ExpressJS et Mongoose

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

La partie de AngularJS ressemble à ceci:

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

Et plus tard, je peux heureusement accéder à ces données (par exemple {{}} contact.name)

Le problème est que lorsque je tente de voir un seul résultat, en utilisant 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); 
     } 
    }); 
} 

Mon AngularJS ViewController regarde comme tel:

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; 
    }); 
} 

Et il est invoqué par:

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

Cependant, l'erreur que je continue à recevoir est:

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

Voici un échantillon de la base de données:

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

J'ai lu pas mal d'articles sur la « Cast à ObjectId a échoué pour la valeur « : id » au chemin « _id » » problème, mais je ne comprends pas ... Dois-je créer mon propre identifiant pour les recherches? Dans ce cas, je devrais introduire un schéma d'identification unique auto_increment, ce qui n'est pas recommandé pour MongoDB, donc, pouvez-vous me dire ce que je devrais faire pour pouvoir interroger les données de la bonne façon? Aussi, si vous voyez des problèmes avec ma mise en œuvre actuelle en termes de AngularJS, s'il vous plaît faites le moi savoir (je suis nouveau sur le sujet.).

Mise à jour

Voici comment je routage avec 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:'/'}); 
     }); 

Mise à jour 2

routage côté serveur - express:

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); 

Je suppose que quelque chose manque d'ici alors ...?

Répondre

2

Je suppose que le message est côté serveur par mongo?

Le message signifie que la valeur du _id est :id et non 51c5fde3ce36618e0c000003 et bien sûr la chaîne :id n'est pas un ObjectId valide

Edit: si ce qui précède est correct, dans votre contrôleur de votre appel ajax frappe cet url: http://host:1222/contacts/:id?callback=JSON_CALLBACK votre: id n'est pas paramétré, son codé en dur et est passé en valeur.

Vous devez interpréter la valeur de l'aide $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; 
    }); 
} 
+0

Je mettrai à jour le poste ci-dessus avec le routage. – Tamas

+0

ah en fait je demandais le routage côté serveur de l'application express –

+0

mis à jour à nouveau, même si je parie qu'il ya quelque chose qui manque car je n'ai pas beaucoup de routage passe par express. – Tamas