2016-03-23 2 views
2

Ich baue eine App mit React-Meteor und habe Probleme mit der Zufälligkeit seines Verhaltens. Wenn Teile des App, erhalte ich einen Fehler, der sagt:React-Meteor "kann die Eigenschaft X von undefined nicht lesen" von einer anderen Seite

Kann nicht Eigenschaft X undefinierten

lesen, aber die X (und machen davon) ist von einer anderen Seite, in der Regel aus die Seite, auf der ich vorher war, manchmal von vielen anderen Seiten. Wenn ich jedoch aktualisiere und versuche, wird es keine Fehler erzeugen.

Der Fehler, wenn nur eine zeigt sich wie folgt:

Exception from Tracker recompute function: 
debug.js:41 TypeError: Cannot read property 'jobId' of undefined 
    at React.createClass.getMeteorData (user.jsx:209) 
    at meteor-data-mixin.jsx:89 
    at Tracker.Computation._compute (tracker.js:323) 
    at new Tracker.Computation (tracker.js:211) 
    at Object.Tracker.autorun (tracker.js:562) 
    at meteor-data-mixin.jsx:76 
    at Object.Tracker.nonreactive (tracker.js:589) 
    at MeteorDataManager.calculateData (meteor-data-mixin.jsx:75) 
    at ReactMeteorData.componentWillUpdate (meteor-data-mixin.jsx:22) 
    at ReactCompositeComponentMixin._performComponentUpdate (ReactCompositeComponent.js:535) 

In einigen Fällen mehrere von ihnen werden von ein paar anderen Seiten mit unterschiedlichen Xs zeigen.

Dies ist der Code der Seite Ich bin auf:

Template.addNotification.onRendered(function() { 
    ReactDOM.render(<AddNotification />, 
        document.getElementById("addNotification")); 
}); 

AddNotification = React.createClass({ 
    addNotification: function(evt) { 
     evt.preventDefault(); 
     notificationInfo = { 
      message: ReactDOM.findDOMNode(this.refs.msg).value, 
      notifType: ReactDOM.findDOMNode(this.refs.notifType).value, 
      user: ReactDOM.findDOMNode(this.refs.user).value 
     }; 
     Meteor.call("addNotification", notificationInfo); 
    }, 
    addBunch: function(evt) { 
     evt.preventDefault(); 
     Meteor.call("addBunch", Meteor.userId()); 
    }, 
    render() { 
     return (
      <div> 
       <div>Message:<input type="text" ref="msg"/></div> 
       <div>Type:<input type="text" ref="notifType"/></div> 
       <div>User:<input type="text" ref="user"/></div> 

       <button onClick={this.addNotification}>Add</button> 

       <button onClick={this.addBunch}> 
        Or, add a bunch to current</button> 
      </div> 
     ); 
    } 
}); 

Sie können sehen, dass ich nicht einmal etwas aufrufen, die jobId auf dieser Seite benötigt.

+0

Es ist ein sehr häufiger Fehler in js - vor allem in Meteor-Apps. Sehen Sie sich [diesen Beitrag] an (http://dweldon.silvrback.com/guards). –

+0

Hallo, danke für die Antwort. Hatte eine Lektüre und wunderte sich, wenn Sie sagen: "Während Eisen-Router einen langen Weg zur Lösung des Problems geht, behebt es nicht den Fall, wo die Daten einfach nicht da sind.", Meinen Sie den Fall, wo die Daten nicht sind Ja, oder nur dass es keine Daten gibt, zu erwarten? – ys27

+0

Ich meine den Fall, wo gerade keine Daten in der db sind. –

Antwort

2

Das klingt wie ein Fall, wo Sie eine guard benötigen. Werfen Sie einen Blick auf die Quelle des Fehlers und schützen es mit so etwas wie:

obj && obj.jobId 

Wo obj die möglicherweise nicht definierte Objekt ist.

Verwandte Themen