MisutoWolf
MisutoWolf

Reputation: 1233

How do I deal with AWS and Session variable in Meteor?

I'm working on a small app for a school-related project, and I'm having some trouble understanding what I am doing wrong. I'm using the npm-apac module (using meteor-npm), and it's working properly (returning results to server-side console), but it's not doing things client-side that I want it to do. Related code is as follows:

Meteor Method (Server)

Meteor.startup ->

    Meteor.methods

        "isbnLookup": (isbn) ->

            console.log isbn

            opHelper.execute 'ItemLookup',
                SearchIndex: 'Books',
                ResponseGroup: 'Medium,Images',
                IdType: 'ISBN',
                ItemId: isbn
            , (res) ->
                console.log res
                return res

Meteor Event (Button clicked on form to submit ISBN#)

Template.addbook.events

    'click #isbn-btn': ->

        theISBN = $("#isbn").val().trim()
        console.log theISBN
        Meteor.call 'isbnLookup', theISBN, (err, res) ->
            if (err)
                console.log(err.reason)
            else
                console.log 'SUCCESS!'
                Session.set('isbnResult', res)

Template helper for grabbing result from Meteor.call, which is supposedly stored in Session

Template.addbook.helpers
    amazonSection: ->
        Session.get('isbnResult')

Section of page that calls the above helper, which I thought would display the (unformatted, json junk) results from the above helper:

<div class="col-lg-6">
    {{ amazonSection }}
</div>

I really don't know what I'm doing wrong. I'm sort of new to dealing with this Meteor.call stuff, and since it's using a NPM module and other things, I thought I was handling callbacks the way I was supposed to. When I check the server console, the console.log is indeed outputting data from Amazon, so I know that APAC is working correctly, I just am not able to transfer that result over to the client for display, apparently.

Any help would be greatly appreciated.

Upvotes: 0

Views: 138

Answers (1)

Neil
Neil

Reputation: 2147

opHelper.execute is asynchronous so isbnLookup will always return undefined. The solution is discussed in this related question.

Meteor: Calling an asynchronous function inside a Meteor.method and returning the result

Alternatively, if you stored the results of the lookup in a collection, you would see the result in the collection when the lookup completes.

Template.addbook.events 

  "click #isbn-btn": ->

    theISBN = $("#isbn").val().trim()
    Session.set "isbn", theISBN

    return  if Books.findOne(ItemId: theISBN)

    Meteor.call "isbnLookup", theISBN, (err, res) ->
      if err
        console.log err.reason
      else
        console.log "SUCCESS!"
      return


Meteor.startup ->

  Meteor.methods isbnLookup: (isbn) ->

    opHelper.execute "ItemLookup",
      SearchIndex: "Books"
      ResponseGroup: "Medium,Images"
      IdType: "ISBN"
      ItemId: isbn
    , Meteor.bindEnvironment((res) ->
      Books.insert res
    )



Template.addbook.helpers
  amazonSection: ->
    Books.findOne(ItemId: Session.get("isbn"))

Upvotes: 1

Related Questions