J'essaie de créer une sorte de relation dans mon API entre Retailers
et GeofencePoints
. Un objet détaillant devrait avoir une liste de points de geofence. J'ai essayé de suivre les documents officiels: http://mongoosejs.com/docs/populate.html. J'obtiens une réponse http 200 lorsque j'effectue la requête pour METTRE un emplacement geofence pour un détaillant, mais lorsque j'obtiens l'objet Retail par l'ID, la liste geofencePoints est toujours vide. Qu'est-ce que je fais mal? Voici mon code:mongoose population de documents d'autres collections
Routes
app.route('/geofencePoints')
.get(geofencePointController.GET)
.post(geofencePointController.POST)
.delete(geofencePointController.DELETE)
app.route('/geofencePoints/:point_id')
.get(geofencePointController.GETid)
.put(geofencePointController.PUTid)
.delete(geofencePointController.DELETEid);
app.route('/retailers')
.get(retailerController.GET)
.post(retailerController.POST);
app.route('/retailers/:retailer_id')
.get(retailerController.GETid)
.put(retailerController.PUTid)
.delete(retailerController.DELETEid);
app.route('/retailers/:retailer_id/geofencePoints')
.put(geofencePointController.PUTgeofencesForRetailId);
geofencePointController.js
var GeofencePoint = require('../model/geofencePoint');
var Retailer = require('../model/retailer');
exports.GET = function (req, res) {
GeofencePoint.find(function (err, points) {
if (err)
res.send(err);
res.json(points);
});
};
exports.POST = function (req, res) {
var geofencePoint = new GeofencePoint();
geofencePoint.name = req.body.name;
geofencePoint.latitude = req.body.latitude;
geofencePoint.longitude = req.body.longitude;
geofencePoint.radius = req.body.radius;
geofencePoint.save(function (err) {
if (err)
return res.json({ success: false, msg: 'Name already exists.' });
res.json({ success: true, msg: 'Successful created new geofence.' });
});
};
exports.DELETE = function (req, res) {
GeofencePoint.remove({
}, function (err, point) {
if (err)
res.send(err);
res.json({ message: 'Successfully deleted all' });
});
};
exports.GETid = function (req, res) {
GeofencePoint.findById(req.params.point_id, function (err, point) {
if (err)
res.send(err);
res.json(point);
});
};
exports.PUTid = function (req, res) {
GeofencePoint.findById(req.params.point_id, function (err, point) {
if (err)
res.send(err);
point.name = req.body.name;
point.latitude = req.body.latitude;
point.longitude = req.body.longitude;
point.radius = req.body.radius;
point.save(function (err) {
if (err)
res.send(err);
res.json({ message: 'Geofence location updated!' });
});
});
};
exports.DELETEid = function (req, res) {
GeofencePoint.remove({
_id: req.params.point_id
}, function (err, point) {
if (err)
res.send(err);
res.json({ message: 'Successfully deleted' });
});
};
//===================================================================
// JOINED DATA
//===================================================================
exports.PUTgeofencesForRetailId = function (req, res) {
Retailer.find({}).populate(req.params.retailer_id).exec(function (err, geofencePoint) {
if (err) return handleError(err);
var geofencePoint = new GeofencePoint();
geofencePoint.name = req.body.name;
geofencePoint.latitude = req.body.latitude;
geofencePoint.longitude = req.body.longitude;
geofencePoint.radius = req.body.radius;
geofencePoint.save(function (err) {
if (err) return res.json({ success: false, msg: 'Something went wrong' });
res.json({ success: true, msg: 'Success' });
});
});
};
retailerController.js
var Retailer = require('../model/retailer');
exports.GET = function (req, res) {
Retailer.find(function (err, retailers) {
if (err)
res.send(err);
res.json(retailers);
});
};
exports.GETid = function (req, res) {
Retailer.findById(req.params.retailer_id, function (err, retailer) {
if (err)
res.send(err);
res.json(retailer);
});
};
exports.POST = function (req, res) {
var retailer = new Retailer();
retailer.name = req.body.name;
retailer.save(function (err) {
if (err)
return res.json({ success: false, msg: 'Name already exists.' });
res.json({ success: true, msg: 'Successful created new retailer.' });
});
};
exports.PUTid = function (req, res) {
Retailer.findById(req.params.retailer_id, function (err, retailer) {
if (err)
res.send(err);
retailer.name = req.body.name;
retailer.save(function (err) {
if (err)
res.send(err);
res.json({ message: 'Retailer updated!' });
});
});
};
exports.DELETEid = function (req, res) {
Retailer.remove({
_id: req.params.point_id
}, function (err, retailer) {
if (err)
res.send(err);
res.json({ message: 'Successfully deleted' });
});
};
retailer.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var retailerSchema = new Schema({
name: {
type: String,
required: true
},
mail: {
type: String,
},
telephone: {
type: String,
},
street: {
type: String,
},
housenumber: {
type: String,
},
postalCode: {
type: String,
},
city: {
type: String,
},
slogan: {
type: String,
},
geofencePoints : [{
type: Schema.Types.ObjectId,
ref: 'GeofencePoint' }]
});
module.exports = mongoose.model('Retailer', retailerSchema);
geofencePoint.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var pointSchema = new Schema({
name: {
type: String,
required: true
},
latitude: {
type: Number,
required: true
},
longitude: {
type: Number,
required: true
},
radius: {
type: Number,
required: true
},
duration: {
type: Number,
},
});
module.exports = mongoose.model('GeofencePoint', pointSchema);
J'espère que quelqu'un peut expliquer ce que je fais mal. Thx
Thx pour l'entrée. Vous avez raison et ça marche maintenant. Qu'entendez-vous par "il y a une meilleure approche"? – Tim
Heureux que cela fonctionne! Par "meilleure approche", je veux dire quelque chose qui évite trop de rappel, peut-être avec l'utilisation de _Promise_ ou _Async.js_ librairie. – TGrif