Search code examples
htmlarraysmeteormongodb-querymeteor-helper

Why is my attempt to fetch and show MongoDB documents in my Meteor app crashing?


I'm trying to fetch and display some MongoDB documents in my Meteor app. I am trying to use the docs here as a basis for this.

The HTM I've added is this:

{{> placesLived}}
    . . .
<template name="placesLived">
  <table style="width:60%">
  {{#each places}}
  <tr>
    <td>{{ts_city}}</td>
    <td>{{ts_state}}</td>
    <td>{{ts_yearin}}</td>
    <td>{{ts_yearout}}</td>
  </tr>
  {{/each}}
</table>
</template>

...so that the entire .html file is now this:

<head>
  <title>timeandspace</title>
</head>

<body>
  <h1>A List of the Places I Have Lived</h1>
  {{> addTimeSpaceForm}}
  {{> placesLived}}
</body>

<template name="addTimeSpaceForm">
<form>
    <label for="city">City</label>
    <input type="text" name="city" id="city">
    <br/>
    <label for="state">State</label>
    <input type="text" name="state" id="state">
    <br/>
    <label for="yearin">Year Arrived</label>
    <input type="text" name="yearin" id="yearin">
    <br/>
    <label for="yearout">Year Departed</label>
    <input type="text" name="yearout" id="yearout">
    <br/>
    <input type="submit" name="insertdocument" id="insertdocument" value="Add Place Lived">
</form>
</template>

<template name="placesLived">
  <table style="width:60%">
  {{#each places}}
  <tr>
    <td>{{ts_city}}</td>
    <td>{{ts_state}}</td>
    <td>{{ts_yearin}}</td>
    <td>{{ts_yearout}}</td>
  </tr>
  {{/each}}
</table>
</template>

The Javascript I've added is this:

Template.placesLived.helpers({
  places: function () {
    // this helper returns a cursor of all of the documents in the collection
    return TimeAndSpace.find();
  }
});

...so that the entire .js file is now this:

TimeAndSpace = new Mongo.Collection('timeAndSpace');

if (Meteor.isClient) {
    Template.addTimeSpaceForm.events({
        'submit form': function(event){
            event.preventDefault();
            var city = event.target.city.value;
            var state = event.target.state.value;
            var yearin = event.target.yearin.value;
            var yearout = event.target.yearout.value;

            Meteor.call('insertLocationData', city, state, yearin, yearout);
        }
    });
}

if (Meteor.isServer) {
  Meteor.startup(function () {
    // code to run on server at startup
  });

  Meteor.methods({
      'insertLocationData': function(city, state, yearin, yearout){
          console.log('attempting to insert a record');
          TimeAndSpace.insert({
              ts_city: city,
              ts_state: state,
              ts_yearin: yearin,
              ts_yearout: yearout
          });
      }
  });
}

Template.placesLived.helpers({
  places: function () {
    // this helper returns a cursor of all of the documents in the collection
    return TimeAndSpace.find();
  }
});

My notion of what is supposed to happen here is that the "placesLived" template is added to the page, which template calls the "places" function in the js file -- which returns all the TimeAndSpace documents -- and finally the "placesLived" template loops through those returned documents, placing each field in a "td"

However, saving these changes (which restarts the Meteor app) wreaks havoc in the Meteor field: the command prompt cast the following aspersions (not to be confused with asteroids) on me:

enter image description here

The Meteor machine is obviously not amused. What have I fouled in my code / what needs to change?


Solution

  • Your helper is running on the client & server. Put an isClient around it & you'll be fine.

    Anytime you get pretty purple/blue colors on the console it means something is wrong with your server. When it says Template is not defined that tells you the server can't find something called Template.