0

I have a schema that defines location as an array, into which I would like to write 2 strings (gmaps geocoding lat, long). So far I can't get it to work and can't figure out why. Any help is appreciated.

My schema:

var mongoose = require('mongoose');
var uniqueValidator = require('mongoose-unique-validator');
var Schema = mongoose.Schema;

//shop schema
var ShopSchema = new Schema({
    name: { type: String, required: true, unique: true },
    address: { type: String, required: true },
    location: [{
        latitude: String,
        longitude: String
    }]
});

ShopSchema.plugin(uniqueValidator);

module.exports = mongoose.model('Shop', ShopSchema);

post request:

.post(function(req, res) {
            //create a shop
            var shop = new Shop();
            //set the shop information
            shop.name = req.body.name;
            shop.address = req.body.address;

            //get lat and long before saving from gmaps API
            //build gmaps API URL
            var urlAddress = req.body.address.replace(/ /gi, '+');
            var urlAPIKey = '&key=AIzaSyChkPdCaAaVZwYof8ZbKspokuYt41NlJ_0';
            var url = 'https://maps.googleapis.com/maps/api/geocode/json?address=';
            url = url.concat(urlAddress).concat(urlAPIKey);

            //make a request
            request({
                uri: url,
                method:"GET",
                timeout: 1000
                }, function(error, response, body) {
                    var gmaps = JSON.parse(body);
                    //display the geometry array
                    shop.location.latitude = gmaps.results[0].geometry.location.lat;
                    shop.location.longitude = gmaps.results[0].geometry.location.lng;
                    //save shop and check for errors
                    shop.save(function(err) {
                        if(err) {
                                return res.send(err);
                        }
                        else {
                            res.json({ message:'Shop created! '});
                        }
                    });
            });
        }) //closes .post on /shops

Basically I build an URL, make a request that returns JSON data, parse it, find it, and then try writing it. When I tried writing it without using an object (as properties on shop) it worked.

Thanks for the help

1 Answer 1

1

In your Shop schema, the location field is of type Array. You have to push the location object into the array after getting the response but you are trying to create an object instead of push object into array.

Change these two lines of your code from

shop.location.latitude = gmaps.results[0].geometry.location.lat;
shop.location.longitude = gmaps.results[0].geometry.location.lng;

to

shop.location.push({ latitude: gmaps.results[0].geometry.location.lat.toString(), longitude: gmaps.results[0].geometry.location.lng.toString() });
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.