繁体   English   中英

流星服务器端HTTP请求

[英]Meteor Server-Side HTTP Request

我正在尝试构建的小型流星应用程序遇到一些问题。 我有一种不完全了解服务器-客户端关系如何工作的结果。 我试图使其工作数小时,并将其视为设置它的唯一合乎逻辑的方法。 我可能是个初学者,这可能会有所帮助。

还值得注意的是,我在客户端发出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>

从技术上讲,您得到此错误是因为您编写了session.set(varhere)而不是Session.set('nameofsessionvar',newvalueforsessionvar)。 但是,即使那样,它也不起作用,因为Session变量是按客户端(而不是服务器)按客户端全局可用的。

尝试更改:

//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;
}

您可能会误解使用不同框架的Meteor Session 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 = "";
          });
        }
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM