Wednesday, June 26, 2013

revoltdc hackathon 20130622 [iteration 2] {Fail}

Still talking meteor 0.6.4 here, changeset here

Reviewing the docs I noted that during deployment you need to deal sometimes with fibers which I have seen referenced to futures. So I decided to see what I could glean from finding it.

ls .meteor/local/build/server/node_modules/fibers/

Then not having noticed anything jump out at me immedeately, searched and found some references

Sources

Added this, which fails

Meteor.startup ->
    require = __meteor_bootstrap__.require
    Future = require('future');
    return

As you can see

[26/5/2013][13:49:1.805][SERVER][Observatory][VERBOSE][] Creating logger with level DEBUG, print to console: true, log user: true
TypeError: undefined is not a function
    at app/server/Server.coffee.js:7:19
    at run (/revoltdc_hackathon_20130622_continued/.meteor/local/build/server/server.js:329:63)
    at Array.forEach (native)
    at Function._.each._.forEach (/.meteorite/meteors/meteor/meteor/9bb2b5447e845c4f483df5e9b42a2c1de5ab909b/dev_bundle/lib/node_modules/underscore/underscore.js:78:11)
    at run (/revoltdc_hackathon_20130622_continued/.meteor/local/build/server/server.js:329:7)

Removed

Meteor.startup ->
    require = __meteor_bootstrap__.require
    Future = require('future');
    return

Result:

Server doesn’t crash

Searched more: meteor futures fiber

Source

In the code below, I attempt at first to use just a single future object, but the server complained. I believe there is a way to do this, but this isn’t it. Anyhow, I added two futures. The result is the same; perhaps setting the session in the router is the real issue.

checkCapitolWords: (query) ->
        Future = Npm.require("fibers/future");
        fut = new Future()
        fut2 = new Future()
        result = Meteor.http.call('GET',"http://congress.api.sunlightfoundation.com/legislators",
            params:
                "apikey": sunlight_api_key,
                "last_name": query,
            ,(err,res)->
                    return fut.ret(res)            
        )
        result = fut.wait()
        console.log( query + " is query")
        if result.statusCode is 200
           resulting = JSON.parse(result.content); 
           console.log( resulting.results[0].bioguide_id )
           bioguide_id = resulting.results[0].bioguide_id
           capitol_by_leg = Meteor.http.call('GET',"http://capitolwords.org/api/1/phrases.json"
                params:
                    "apikey": sunlight_api_key,
                    "entity_type": "legislator",
                    "entity_value": bioguide_id
                (err,res)->
                    return fut2.ret(res)
           )
           capitol_by_leg = fut2.wait()
           if capitol_by_leg.statusCode is 200
              resulting = JSON.parse(capitol_by_leg.content);  
              resulting.sort (a, b)->
                return b.count - a.count
              console.log(resulting)
              return resulting
            else
              return resulting
        false

So let’s review what I learned from failure.

  • There exists a meteor bootstrap function I can use to require stuff
  • I can use a future to guarantee waiting on a callback
  • Most people suggest using a collection to update, which in turn will behave reactively, the session may be a poor choice here
  • The regular future object can’t be reused
  • The location of fibers in the local hidden directory
Other points I’d like to explore
  • Is there a way to use one meteor method to call another?
  • If so, will my this work differently?
  • We should verify using a collection to update will in turn will behave reactively

No comments:

Post a Comment