使用React-Redux API链接Mongoose中的ES6承诺

时间:2016-08-09 22:40:48

标签: javascript node.js mongodb mongoose

我有几个型号:

  1. CountryModel - 没有引用,
  2. PersonModel - 有一个phone_id引用,
  3. PhoneModel - 有country_code参考
  4. 使用下面的代码,我已经能够使用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));
            });
          }
        });
      });
    }
    

1 个答案:

答案 0 :(得分:0)

两天后想出这个。解决方案可能是独一无二的,但我认为这对参与映射 ES6承诺并处理从这些 ES6承诺派生的参考的猫鼬模型有帮助,所以我有对解决方案非常详细。

  

<强>予。场景:

     

1. PersonModel具有来自PhoneModel的集合phone_ids。

     

2. PhoneModel需要country_id并且有country_code。

     

3. CountryModel具有PhoneModel需要的country._id属性和country_code。

<强> II。简单部分:

在我的apx调用的redux操作中,这里是国家/地区获取方法手机添加新方法

<强>一个。国家行动......

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。冒险部分:

     

人员行动有种子,并为我需要做的添加新方法。

     
      
  1. 我需要通过人物映射,

  2.   
  3. 通过手机映射,

         

    一个。获取每部手机的country_id

         

    湾将每部手机添加到手机集中

         

    ℃。将相应的phone._id传递给此人

  4.   
  5. 在集合中添加新人。

  6.   

<强>一个。人的行为....

  

让我花了一段时间才弄明白的困难部分是种子   方法

     

要考虑的要点:

     
      
  1. 将映射分配给变量。

  2.   
  3. 由于手机动作的addNew除了添加新手机外还进行了CountryModel搜索,我只需要在映射中调用它的addNew方法。

  4.   
  5. 然后我通过module.exports.addNew&#39;

  6. 使用相同的模块调用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);
        }
      })
    })
  },

 ....
}

与往常一样,文档中的所有内容都过于简化,并且在实际场景中并不十分清晰。希望这有助于人们!