Mongoose.Create未发送指定值

时间:2015-07-29 20:50:17

标签: javascript node.js express mongoose

更新(下面的答案是正确的并且有助于更改代码,现在的问题在于mongoose和mongoDB,其中mongoose似乎尝试创建集合而不是实际编写文档)

为什么我不能绑定嵌套在req.body.goe.coordinates.0或.1中的项目req.body.geo.coordinates显示为具有两个数字的数组的对象(坐标)。到目前为止,我可以让服务器写入所有其他字段接受geo字段。

我假设我可以使用req.body.geo.coordinates.0,因为零将是数组中的第一个数字,对吧?我必须错误地考虑req.body并尝试以不正确的方式访问它。

如何访问这些坐标,以便将它们放在mongoose模式中的正确位置。我尝试将它作为整个对象加载,但是猫鼬不会写那个geo部分并且会使用默认值。

一如既往地感谢您的回复。

mongoose schema的相关部分:

var itemsSchema = new Schema({item:{
user_name: {type: String, default: 'badboy for life'},
city: {type:String},
geo:{
    gtype: {type:String, default: "Point"},         
    coordinates: {longitude: {type:Number, default: -97.740678},  
               latitude: {type:Number, default: 30.274026 }},
},
title: {type: String, match: /[a-z]/},
desc: {type:String},
cost:{type: Number, index: true},

//Still can't get the image to load into mongoose correctly I'm assuming 
//   i'm doing it wrong but that's a question for another day.
//image: {                            
//  mime:  {type:String},
//  bin: Buffer,
//  }

}});

Express app.post处理邮件到mongoDB服务器。它当前吐出默认值。

 app.post('/js/dish', parser, function(req, res) {

        var a = req.body.user_name;
        var b = req.body.title;
        var c = req.body.cost;
        var d = req.body.ingdts;
        var e = req.body.location;
        var f = req.body.geo.coordinates.0;
        var g = req.body.geo.coordinates.1;

        // create an object, information comes from AJAX request from Angular

    console.log(req.body.geo["coordinates"]);
    console.log("hey the object request has this in it: "+ req, req.method);

        Item.create({"item.user_name":a, "item.title": b, "item.cost": c, "item.desc": d, "item.city": e, "item.geo.coordinates.latitude":f,"item.geo.coordinates.longitude":g},

         function(err, item) {
            if (err){
                res.send(err);
            }else{
                // get and return all the items after you create another
                getItems(res);
            }

        });

在Angular中获取并设置GPS的地图服务

(function(){

var mapSrvc = angular.module("mapService",[]);
console.log('map factory baby!')
  var position = [];
  var mapPopulation = [];

    mapSrvc.service('Maping',['$http',function(){
        return{
            getUserGPS:function(){
            return position;
            },
        setUserGPS:function(lat,long){
            return position = [lat,long];
            },
        getMapPop:function(dbLocs){
            return mapPopulation = dbLocs;
            }
        }
    }])

})();

设置值并将其发送到应用程序的快速部分的Angular控件

    $scope.createItem = function(item){
    if($scope.items.text != false){
      var itemCord = Maping.getUserGPS();
        $scope.items={
            user_name: item.user_name,
            title: item.title,
            cost: item.cost,
            location: item.location,
            ingdts: item.ingdts,
            geo:{coordinates:{longitude:itemCord[1],latitude:itemCord[0]}}
            }
        console.log("breadcrumb to see if item was defined: ",$scope.items)

        $scope.loading = true;

        Items.create($scope.items)

        .success(function(data){
            Items.get()
            .success(function(data){
            $scope.items= data;
            $scope.loading = false;
            console.log(data);
        })

        .error(function(err){
          console.log('Error: ' + err);
        });
            $scope.loading=false;
            $scope.items= {};
            $scope.items= data;
            })
            .error(function(err){
                console.log('Error: ' + err);
            });
    }
};

1 个答案:

答案 0 :(得分:1)

架构中的坐标对象是对象文字,而不是数组。

可以通过索引访问数组元素,但不能按照您的假设访问。在数组中,您可以使用括号表示法访问元素,因此请考虑以下内容:

var foo = ["bar", "baz"];
console.log(foo[0]);

但是对于一个对象,除非您实际上抓住名为0和1的键,否则它不会以相同的方式工作。

如果要在上面的括号表示法中访问longitudelatitude,则架构中的坐标对象必须是一个数组。虽然,这种命名值并将它们放在longitudelatitude对象中是没用的。在这里谈论这一部分(我拿出评论以便更容易理解):

 coordinates: {longitude: {type:Number, default: -97.740678}, latitude: {type:Number, default: 30.274026 }},

您还有其他选择可能更合适。只需按键访问坐标对象中的值即可。你知道对象文字在JavaScript中是如何工作的吗?您可以通过您提供的名称(或)访问它们,而不是按编号(或索引)访问值。因此,您可以访问以下值:

var f = req.body.geo.coordinates.longitude;
var g = req.body.geo.coordinates.latitude;

...因为那是你的名字。

简单来说,要通过索引访问,要么将键0和1命名为坐标对象中的经度和纬度(您可能不应该这样做),或者将坐标对象放入一个数组中,如上例所示foo,或者通过您直接在上面提供的名称访问密钥。