更新(下面的答案是正确的并且有助于更改代码,现在的问题在于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);
});
}
};
答案 0 :(得分:1)
架构中的坐标对象是对象文字,而不是数组。
可以通过索引访问数组元素,但不能按照您的假设访问。在数组中,您可以使用括号表示法访问元素,因此请考虑以下内容:
var foo = ["bar", "baz"];
console.log(foo[0]);
但是对于一个对象,除非您实际上抓住名为0和1的键,否则它不会以相同的方式工作。
如果要在上面的括号表示法中访问longitude
和latitude
,则架构中的坐标对象必须是一个数组。虽然,这种命名值并将它们放在longitude
和latitude
对象中是没用的。在这里谈论这一部分(我拿出评论以便更容易理解):
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
,或者通过您直接在上面提供的名称访问密钥。