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 ...?
Je mettrai à jour le poste ci-dessus avec le routage. – Tamas
ah en fait je demandais le routage côté serveur de l'application express –
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