2015-12-04 221 views
1

我正在嘗試構建一個小型流星應用程序。我有一種感覺,它不完全理解服務器 - 客戶端關係如何工作的結果。我試圖讓它工作幾個小時,並將其視爲設置它的唯一合理方法。這可能有助於補充說我是初學者。流星服務器端HTTP請求

值得一提的是,我在客戶端發出http請求時運行正常。

什麼是應該發生:

表單提交,表單中的文本發送到通過HTTP請求的API,JSON返回,解析,並返回一個值返回給用戶(他們給一個國家代碼,它返回一個邊界)。除此之外,我想將每個請求存儲在帶有時間戳的集合中。

任何幫助將不勝感激。

這裏是JS:

borders = new Mongo.Collection("borders"); 

if (Meteor.isClient) { 
    // This code only runs on the client 

    //set the session blank before submit action on form. 

    Template.hello.helpers({ 
    borders: function() { 
     // return borders.find({}); 
     // return borders.find({}, {limit: 1}); 
     return Session.get("border"); 
    } 
    }); 

    Template.body.events({ 
    "submit .new-task": function (event) { 
     // Prevent default browser form submit 
     event.preventDefault(); 

     // Get value from form element 
     var countryCode = event.target.text.value; 

     //set form element variable in the session so it can be accessed on the server 
     session.set(countryCode) 

     //invoke the server method 
     Meteor.call("getID", function(error, results) { 
     console.log(results.content); //results.data should be a JSON object 
     }); 

    } 
    }); 
} 

//server-side code 
if (Meteor.isServer) { 
     session.get(countryCode) 
     var url = "http://restcountries.eu/rest/v1/alpha/"+countryCode; 
    Meteor.methods({ 
     getID: function() { 
      this.unblock(); 
      HTTP.get(url, {timeout:30000}, function(error, response) { 
      var respJson = JSON.parse(response.content); 
      console.log(respJson) 
      Session.set("border",respJson["subregion"]) 
      // Insert a task into the collection 
      borders.insert({ 
       text: respJson["borders"], 
       createdAt: new Date() // current time 
      }); 
      // Clear form 
      event.target.text.value = ""; 
      }); 
     } 
    }); 
} 

錯誤,我得到當應用程序運行:

=> Started proxy.        
=> Started MongoDB.       
W20151203-17:09:54.345(-8)? (STDERR)   
W20151203-17:09:54.346(-8)? (STDERR) /Users/me/.meteor/packages/meteor-tool/.1.1.10.1evms9b++os.osx.x86_64+web.browser+web.cordova/mt-os.osx.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:245 
W20151203-17:09:54.347(-8)? (STDERR)      throw(ex); 
W20151203-17:09:54.347(-8)? (STDERR)       ^
W20151203-17:09:54.347(-8)? (STDERR) ReferenceError: session is not defined 
W20151203-17:09:54.347(-8)? (STDERR)  at borderApp.js:38:7 
W20151203-17:09:54.347(-8)? (STDERR)  at /Users/me/Dev/Web/borderApp/.meteor/local/build/programs/server/app/borderApp.js:67:4 
W20151203-17:09:54.347(-8)? (STDERR)  at /Users/me/Dev/Web/borderApp/.meteor/local/build/programs/server/boot.js:242:10 
W20151203-17:09:54.347(-8)? (STDERR)  at Array.forEach (native) 
W20151203-17:09:54.347(-8)? (STDERR)  at Function._.each._.forEach (/Users/me/.meteor/packages/meteor-tool/.1.1.10.1evms9b++os.osx.x86_64+web.browser+web.cordova/mt-os.osx.x86_64/dev_bundle/server-lib/node_modules/underscore/underscore.js:79:11) 
W20151203-17:09:54.347(-8)? (STDERR)  at /Users/me/Dev/Web/borderApp/.meteor/local/build/programs/server/boot.js:137:5 

這是我使用了前端的HTML:

<head> 
    <title>Todo List</title> 
     <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css"> 
</head> 

<body> 
    <div class="form-group"> 
    <header> 
     <h1>Todo List</h1> 

     <form class="new-task"> 
     <input class="input-lg form-control" type="text" name="text" placeholder="Type to add new tasks" /> 
     </form> 
    </header> 

<H3> 
{{> hello}} 
</h3> 

    </div> 
</body> 

<template name="hello"> 
    <p>{{borders}}</p> 
</template> 

<template name="button"> 
<button type="submit" class="btn btn-danger">Find Borders &rarr;</button> 
</template> 

回答

0

從技術上講,你得到的錯誤是因爲你寫了session.set(varhere)而不是Session.set('nameofsessionvar',newvalueforsessionvar)。但是,即使如此,它也無法工作,因爲會話變量對於客戶端而言是全局可用的,而不是服務器。

嘗試改變:

//session.set(countryCode) 
Meteor.call("getID", countryCode, function(error, results) { 
... 
} 

和:

//session.get(countryCode) 
//var url = "http://restcountries.eu/rest/v1/alpha/"+countryCode; 
getID: function (countrycode) { 
     var url = "http://restcountries.eu/rest/v1/alpha/"+countryCode; 
} 
0

你可能誤解了MeteorSession不同的框架。在MeteorSession僅在客戶端使用,而不是在服務器上,請參考:http://docs.meteor.com/#/full/session

對於你的問題,你可以通過COUNTRYCODE作爲參數Meteor.call

Meteor.call("getID", countryCode, function(error, results) { 
    console.log(results.content); //results.data should be a JSON object 
    }); 

你的服務器:

if (Meteor.isServer) { 
    Meteor.methods({ 
     getID: function (countryCode) { 
     var url = "http://restcountries.eu/rest/v1/alpha/"+countryCode; 
      this.unblock(); 
      HTTP.get(url, {timeout:30000}, function(error, response) { 
      var respJson = JSON.parse(response.content); 
      console.log(respJson) 

      // Insert a task into the collection 
      borders.insert({ 
       text: respJson["borders"], 
       createdAt: new Date() // current time 
      }); 
      // Clear form 
      event.target.text.value = ""; 
      }); 
     } 
    }); 
}