2016-08-09 3 views
0

У меня есть несколько моделей:Цепной ES6 Обещания в Мангуста с помощью React-Redux API,

  1. CountryModel     - никаких ссылок,
  2. PersonModel     - есть ссылка phone_id,
  3. PhoneModel       - имеет ссылку country_code

С ниже код, я был в состоянии семени PhoneModel со ссылкой код_страны, , но когда я пытаюсь раздвинуть phone_ids, потом, в PersonModel, массив всегда пустой.

Что необходимо изменить в коде ниже, чтобы сохранить phone_ids в документе лица?

import * as commonPhone from '../../_common/communication/phone.common.actions.api'; 

function seedDatabase() { 
    return new Promise((resolve, reject) => { 
    PersonModel.find({}, (errFind, collection) => { 
     if (errFind) { 
     console.log(`${PersonModel.modelName} Error: ${errFind.message}`); 
     reject(errFind); 
     } 
     if (collection.length === 0) { 
     data.map(person => { 
      const newPerson = Object.assign({phone_ids: []}, person); 
      person.phone_numbers.map(phone => { 
      // successfully seeded commonPhone collection 
      commonPhone.addNew(phone, (errPhone, newPhone) => { 
      if (errPhone) { 
       console.log(`${commonPhone.modelName} Error: ${errPhone.message}`); 
       reject(errPhone); 
       } 
       resolve(newPhone); 
       // newPerson does show newPhone.id added to array 
       newPerson.phone_ids.push(newPhone.id); 
      }); 
      }) 
      //////////////// PROBLEM IS HERE //////////////// 
      // the array for person's phone_ids is empty?!?!?! 
      console.log('PhoneIds: ' + JSON.stringify(newPerson.phone_ids)); 
     }); 
     } 
    }); 
    }); 
} 

ответ

0

Завершилось это через два дня. Решение может быть уникальным, но я думаю, что это будет полезно для всех, кто участвует в картографии ES6 обещает и имеет дело с монгольскими моделями, у которых есть ссылки, полученные из этих ES6 обещает, поэтому я довольно подробно рассказал о решении.

I. Сценарий:

1. PersonModel имеет коллекцию phone_ids из PhoneModel.

2. Для модели PhoneModel требуется country_id и имеет country_code.

3. Страна CountryModel имеет свойство country._id, которое требуется PhoneModel, и country_code.

II. Easy Часть:

В моем Redux действии, которые у меня есть, как API вызовы, здесь является Страны получить метод и Телефона Addnew метода.

a. страна действия ...

import {CountryRefModel} from '../../../models/_repo.models.api'; 

module.exports { 
..... 
    // need country name too, Canada/US/Carribean Is. have same country_code 
    getIdByCountryCode: (countryName, countryCode) => { 
    return new Promise((resolve, reject) => { 
     CountryRefModel.findOne({name: countryName, country_code: countryCode }, 
     {_id: 1}, (err, result) => { 
     if (err) { 
      console.log(`${CountryModel.modelName} getIdByCountryCode Error: ${err.message}`); 
      reject(err); 
     } 
     resolve(result); 
     }); 
    }); 
    }, 
..... 
} 

а. телефонные действия ...

import {PhoneModel} from '../../../models/_repo.models.api'; 
import * as refCountry from '../../_reference/country/country.reference.actions.api'; 

module.exports { 
.... 
    addNew: (phone) => { 
    return new Promise((resolve, reject) => { 
     refCountry.getIdByCountryCode(phone.country.name, phone.country.country_code) 
     // using then method as country action get method 
     // is already a promise 
     .then(returnValue => { 
     PhoneModel.create({ 
      _id: phone.id, 
      country_id: returnValue, 
      type: phone.type, 
      isMain: phone.isMain ? phone.isMain : false, 
      area_code: phone.area_code, 
      prefix: phone.prefix, 
      suffix: phone.suffix, 
      vanity_number: phone.vanity_number ? phone.vanity_number : null 
     }, (err, result) => { 
      if (err) { 
      console.log(`${PersonModel.modelName} addNew Error: ${err.message}`); 
      reject(err); 
      } 
      resolve(result); 
     }); 
     }); 
    }); 
    }, 
.... 
} 

II. Dicey Part:

Действия человека имеют семена и addNew методы для чего мне нужно.

  1. мне нужно карту через людей,

  2. Карта через свои телефоны,

    а. получите country_id для каждого телефона

    b. добавить каждый телефон в телефонную коллекцию

    c. передать соответствующее phone._id лицу

  3. Добавить нового человека в коллекцию.

а. человек действие ....

Трудная часть, мне потребовалось некоторое время, чтобы выяснить, было семенем метода.

Вопросы для рассмотрения:

  1. Назначение ваших отображения переменной.

  2. С добавлением addNew телефона в дополнение к добавлению нового телефона в CountryModel, мне нужно только вызвать его метод addNew в сопоставлении.

  3. Я затем вызвать метод Addnew с тем же модулем, с помощью module.exports.addNew»

import mongoose from 'mongoose'; 
import {PersonModel} from '../../../models/_repo.models.api'; 
import {addNew} from '../../_common/communication/phone.common.actions.api'; 

const data = require('../../../seed/_common/people/person.seed.api.js').getData(); 

function seedDatabase() { 
    PersonModel.find({}, (errFind, collection) => { 
    if (errFind) { 
     console.log(`${PersonModel.modelName} Seed Error: ${errFind.message}`); 
    } 
    if (collection.length === 0) { 
     const updatedPerson = data.map(person => { 
      person.id = mongoose.Types.ObjectId(); 
      const phoneIds = []; 
      const updatePhones = person.phone_numbers.map(phone => { 
      phone.id = mongoose.Types.ObjectId(); 
      phoneIds.push(phone.id); 
      return addNew(phone); 
      }); 
      return module.exports.addNew(person, phoneIds); 
     }); 
     }); 
     // Just an example of taking the promises further 
     // return LocationModel.addNew(person.id); 
    } 
    }); 
} 

module.exports = { 

    seed:() => seedDatabase(), 

    .... 

    addNew: (person, phoneIds) => { 
    return new Promise((resolve, reject) => { 
     person.phone_ids = (phoneIds); 
     PersonModel.create({ 
     prefix: person.prefix, 
     fName: person.fName, 
     mName: person.mName, 
     lName: person.lName, 
     suffix: person.suffix, 
     profDes: person.profDes, 
     gender: person.gender, 
     email: person.email, 
     phone_ids: person.phone_ids, 
     lang_key: person.lang_key 
     }, (err, result) => { 
     if (err) { 
      console.log(`${PersonModel.modelName} addNew Error: ${err.message}`) 
      reject(err); 
     } else { 
      resolve(result); 
     } 
     }) 
    }) 
    }, 

.... 
} 

Как обычно, все в документации чрезмерно упрощенным и не в полной мере ясны в реальных сценариях. Надеюсь, это помогает людям!

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