2016-08-09 3 views
0

나는 몇 가지 모델이 API를 :체인화 ES6 사용하여 몽구스의 약속 반작용-돌아 오는

  1. CountryModel     - 아니 참조,
  2. PersonModel    을 - phone_id 참조가,
  3. PhoneModel  (210)  은 - 아래의 코드와 COUNTRY_CODE 참조

을 가지고, I는 COUNTRY_CODE의 참조 을 PhoneModel 씨앗 할 수 있었다하지만 난 PersonModel로, 그 후, phone_ids를 집어 넣으려고 시도 할 때, 배열은 항상 빈.

사람 문서에 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

2 일 후에 이것을 나타냅니다. 솔루션은 고유 할 수도 있지만 매핑과 관련된 사람들에게 도움이 될 것이라고 생각합니다. ES6은을 약속하고 이것들에서 파생 된 참조를 가진 몽구스 모델을 다루고 있습니다. ES6은을 약속하므로 솔루션에 대해 매우 자세히 설명했습니다.

I. 시나리오 :

1. PersonModel는 PhoneModel에서 수집 phone_ids 있습니다.

2. PhoneModel에는 country_id가 필요하며 country_code가 있습니다.

3. CountryModel에는 PhoneModel에 필요한 country._id 속성과 country_code가 있습니다.

II. 쉬운 부분은 : 여기, API 호출로가 내 REDUX 작업에서

국가 방법전화 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); 
     }); 
    }); 
    }, 
..... 
} 

을 수행합니다. 전화 작업 ...

II

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); 
     }); 
     }); 
    }); 
    }, 
.... 
} 
. Dicey 파트 :

person 액션에는 필요한 작업을위한 seed 및 addNew 메소드가 있습니다.

  • 지도 자신의 휴대폰을 통해 나는 사람들을 통해 매핑해야

    1. ,

      을 수행합니다. 각 전화마다 country_id를 가져 오십시오.

      b. 각 전화를 전화 컬렉션에 추가하십시오.

      c. 각각의 phone._id를 사람에게 전달하십시오.

    2. 새로운 사람을 컬렉션에 추가하십시오.

  • . 사람의 행동 ....

    어려운 부분을 알아낼 걸 렸어요 씨앗 방법이었다.

    포인트 고려해야 할

    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); 
         } 
         }) 
        }) 
        }, 
    
    .... 
    } 
    

    , 문서의 모든 지나치게 단순화 실제 시나리오에서는 분명하지 않습니다. 희망이 사람들을 돕는다!