2017-03-06 1 views
1

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

Répondre

0

Vous devez enregistrer une référence à la nouvelle création GeofencePoint dans votre document Détaillant.
Aussi, je ne comprends pas pourquoi vous essayez de peupler Retailer lorsque vous effectuez une mise à jour (et je pense que vous essayez de le remplir mal, le seul élément à peupler ici est en effet le geofencePoint, pas détaillants). Il y a certainement une approche meilleure/plus concise, en accord avec votre application, mais cela donne une idée.

+0

Thx pour l'entrée. Vous avez raison et ça marche maintenant. Qu'entendez-vous par "il y a une meilleure approche"? – Tim

+0

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