传递给Meteor.call时遗失了对象的数据

时间:2016-08-16 23:40:33

标签: javascript arrays object meteor reactjs

在我的React / Meteor应用程序中,我试图将一个带有状态数据的对象传递给服务器上的方法,以便插入到数据库中。然而,似乎存在将对象从React组件传递到Meteor方法的问题 - 其中一个子对象最终在Meteor方法中,但它的所有子对象都消失了。除了使用check()以确保它是Object

之外,我对该对象不执行任何操作
'Appointments.saveData'(dataObj) {
   check(dataObj, Object);

   console.log(dataObj);

   // ....
 }

这是前端发生的事情:

Meteor.call('Appointments.saveData', {
  vitalsData: this.state.vitalsData || {},
  subjectiveData: this.state.subjectiveData || '',
  physicalExamData: this.state.physicalExamData || {},
  rosData: this.state.rosData || {},
  impressionData: this.state.impressionData || [],
  extraNotes: this.state.extraNotes || ''
}, (err, res) => {
  if (res && !err) {
    this.refs.toasts.success(
      'Data for this encounter has been saved.',
      'Records saved!'
    );
  } else {
    this.refs.toasts.error(
      'An unknown error has occurred. Reload the page and try again.',
      'Error!'
    );
  }
});

我使用{}将所有状态变量合并到一个对象中,而该方法又变为dataObj。但是,dataObj.impressionData存在,并且是包含对象的数组,但是,数组中的任何对象都缺少数据。

例如,dataObj.impressionData[0].diagnosis应该是一个对象,实际上,它应该是已经从数据库中提取的对象的精确副本。但是,如果我console.log,则该对象为空。

我已经验证了数据在传递给Meteor方法之前的每一步都应该存在。我在调用console.log之前立即Meteor.call该对象,并在我的方法中调用check之后立即执行。我不能为我的生活理解为什么数据丢失。

我忘了什么?

编辑:我已更改了我的代码,以便数据现在直接从ref添加到州。现在,服务器方法正确接收对象。但是,在以下代码中:

if (dataObj.impressionData && dataObj.impressionData.length > 0) {
      dataObj.impressionData.forEach(obj => {
        console.log(obj); // obj.diagnosis exists and is as expected
        const x = ICD10Codes.findOne({ _id: obj.diagnosis._id });
        console.log(x); // this also works as it should
        impressionFields.push({ patientId: appt.patient._id, diagnosis: x, note: obj.note, x });
      });
    }

将诊断设置为x,我 KNOW 是直接从数据库中获取对象的有效副本,结果相同:

meteor:PRIMARY> db.EncounterData.findOne()
...
    "impression" : {
        "patientId" : "47de32b428d8c4aaac284af3",
        "appointmentId" : "TwL7DF9FoXPRgmrjR",
        "fields" : [
            {
                "patientId" : "47de32b428d8c4aaac284af3",
                "diagnosis" : {

                }
            }
        ]
    },
...

我想我疯了。

2 个答案:

答案 0 :(得分:0)

所以你的问题归结为this.setState is an asynchronous function,所以当你进行Meteor调用时,this.state还没有实际更新。因此,您需要等待this.setState来电完成。唯一的方法是使用React lifecycle methods。您可以使用componentWillUpdate(在下一个渲染之前调用)或componentDidUpdate(在下一个渲染之后调用)。

var MyComponent = React.createClass({
    save: function() {
        ...
        case 'impression': 
            this.setState({ impressionData: data }, this.callServerMetho‌​d);  
            break;
        ...
    },

    // This is one of the React lifecycle methods
    componentWillUpdate: function(nextProps, nextState) {
        // Put your Meteor call here
        // Make sure to use nextState instead of this.state
        // This way you know that this.state has finished updating
    }
});

答案 1 :(得分:0)

我自己解决了这个问题 - 结果是我将SimpleSchema对象导入为默认值,但将SimpleSchema对象导出为named。因此SimpleSchema对象无效。