2015-06-15 3 views
1

Я пытаюсь создать поддокумент в схеме mongoose из node.js/Express.Как добавить поддокумент в схему mongoose

У меня есть две схемы: Член и Адрес

Member.js

// app/models/member.js 

// load mongoose since we need it to define a model 
var mongoose = require('mongoose'), 
    Schema = mongoose.Schema 

var Address = require('./address'); 

var MemberSchema = Schema({ 
    FName : String, 
    LName : String, 
    address : [Address], 
    phone : { 
    type : String, 
    number : String 
    }, 
    email: String, 
    gender: String, 
    DOB: Date, 
    rank : { 
    level : String, 
    updated: { type: Date, default: Date.now } 
    }, 
    Awards : { 
    personal : Boolean, 
    award : { type : Schema.Types.ObjectId, ref : 'Award' }, 
    granted: { type: Date, default: Date.now } 
    } 
}); 


module.exports = mongoose.model('Member', MemberSchema); 

Address.js

// app/models/address.js 

// load mongoose since we need it to define a model 
var mongoose = require('mongoose'), 
    Schema = mongoose.Schema 

var AddressSchema = Schema({ 
    type : String, 
    street1 : String, 
    street2 : String, 
    City : String, 
    State : String, 
    Zip : Number, 
    Lat : Number, 
    Lng : Number 
}); 


module.exports = mongoose.model('Address', AddressSchema); 

Мой Намерение создать элемент, а затем добавить адрес. Запрос POST для работы участника. Тем не менее, при выполнении запроса POST для адреса он не может сказать неопределенное, и я не могу найти местоположение ошибки. Я надеюсь узнать, как лучше добавлять адреса в мою схему членов.

routes.js

app.route('/api/member') 

    .get(function(req, res) { ... 

    .post(function(req, res) { 
     var new_member = new member(); 
     new_member.FName = req.body.fname; 
     new_member.LName = req.body.lname; 
     new_member.DOB = req.body.DOB; 
     new_member.email = req.body.email; 
     new_member.gender = req.body.gender; 

     new_member.save(function(err) { 
      if (err) 
       res.send(err); 

      res.json({ message: 'Member Created!' }); 
     }); 
    }); 

    app.route('/api/member/:member_id/address') 

    .post(function(req, res) { 
     member.findById(req.params.member_id, function(err, member) { 
     if (err) 
      return (err); 

     new_address = new address(); 
     new_address.type = req.body.atype; 
     new_address.street1 = req.body.street1; 
     new_address.street2 = req.body.street2; 
     new_address.City = req.body.City; 
     new_address.State = req.body.State; 
     new_address.Zip = req.body.Zip; 
     new_address.Lat = req.body.Lat; 
     new_address.Lng = req.body.Lng; 
     console.log(new_address); 

     member.address.push(new_address); 

     res.json({ message : "Address added!!" }); 

     }); 
    }); 

Как я уже сказал, добавив член легко. Добавление адреса приводит к ошибке ниже:

/Users/arcee123/projects/MCARS/node_modules/mongoose/lib/utils.js:419 
     throw err; 
      ^
TypeError: undefined is not a function 
    at Array.MongooseArray._cast (/Users/arcee123/projects/MCARS/node_modules/mongoose/lib/types/array.js:108:30) 
    at Object.map (native) 
    at Array.MongooseArray.push (/Users/arcee123/projects/MCARS/node_modules/mongoose/lib/types/array.js:262:23) 
    at Promise.<anonymous> (/Users/arcee123/projects/MCARS/app/routes.js:108:24) 
    at Promise.<anonymous> (/Users/arcee123/projects/MCARS/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8) 
    at Promise.emit (events.js:107:17) 
    at Promise.emit (/Users/arcee123/projects/MCARS/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38) 
    at Promise.fulfill (/Users/arcee123/projects/MCARS/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20) 
    at /Users/arcee123/projects/MCARS/node_modules/mongoose/lib/query.js:1833:13 
    at model.Document.init (/Users/arcee123/projects/MCARS/node_modules/mongoose/lib/document.js:251:11) 
15 Jun 15:45:49 - [nodemon] app crashed - waiting for file changes before starting... 

, где я иду не так? Благодаря

UPDATE 1: The .post вызов для адреса толчка теперь выглядит следующим образом:

.post(function(req, res) { 
    member.findById(req.params.member_id, function(err, member) { 
    if (err) 
     return (err); 

    new_address = new address(); 
    new_address.type = req.body.atype; 
    new_address.street1 = req.body.street1; 
    new_address.street2 = req.body.street2; 
    new_address.City = req.body.City; 
    new_address.State = req.body.State; 
    new_address.Zip = req.body.Zip; 
    new_address.Lat = req.body.Lat; 
    new_address.Lng = req.body.Lng; 
    console.log(new_address); 

    if(member.address === undefined){ 
     member.address.push(new_address); 
    } 
    else{ 
     member.address = [new_address]; 
    } 

    member.save(function(err) { 
     if (err) 
      res.send(err); 

     res.json({ message: 'Address created!!!' }); 
    }); 

    }); 

}); 
+1

Какая линия 108? – Treesrule14

+0

member.address.push (new_address); – arcee123

+1

Я думаю, что это должно выглядеть так -> http://jsfiddle.net/99yyyoyw/ – adeneo

ответ

2

Поскольку поле адреса не требуется Mongoose при извлечении модели из базы данных поля только что выиграли Определим. Таким образом, вы не сможете добавить поле адреса. Вы должны проверить, чтобы увидеть, если он существует

if(member.address === undefined){ 
    member.address.push(new_address); 
} 
else{ 
    member.address = [new_address]; 
} 

Edit: Также вы затем сохранить его обратно в базу данных. (Вы также можете посмотреть функцию обновления)

+0

Спасибо, поскольку он удаляет ошибки. Однако адрес не добавляется к объекту-члену. что еще мне не хватает? – arcee123

+0

Вы должны отправить его обратно в базу данных !!! – Treesrule14

+0

ОК. Может быть, я что-то упустил. Если member.Save() не так, как мне сохранить его обратно в базу данных? Спасибо – arcee123

1

Так же, как @ Treesrule14 сказал, что если у вас нет начального члена .address, вам нужно будет установить его как [new_address]. Вы сохраняете документ на первом маршруте, но не на втором маршруте. Во втором маршруте вы просто возвращаете документ, не сохраняя его.

Если вы всегда хотите, чтобы поле адреса (даже если оно пустое), вы можете изменить свое поле адреса в схеме элемента, которое должно быть address: {type: [address], default:[]}. Это позволит убедиться, что пустой массив будет по умолчанию по умолчанию, и вы можете нажать на него или прочитать его длину, не беспокоясь о том, что он не определен.

Смежные вопросы