【问题标题】:meteor bindenvironnement issue流星绑定环境问题
【发布时间】:2014-09-18 03:36:07
【问题描述】:
getTime: function () {
                             host="http://www.xxxxxx.com/";
                       res= Meteor.bindEnvironment(function(){
                            var Fiber = Meteor.require('fibers');
                            var Future = Meteor.require('fibers/future');
                            var future = new Future();
                           request(host, function (error, response, body) {
                            Fiber(function(){
                                if (!error && response.statusCode == 200) {

                                    $ = cheerio.load(body);

                                    var $thumbs = $('.thumb');

                                    for (var i = 0, l = $thumbs.length ; i < l ; i++) {

                                        // elements
                                        var $thumb = $($thumbs[i]);
                                        // save info
                                        videourl=host+$thumb.find('a').attr('href');
                                        videothumbs = [$thumb.find('img').attr('src')];

                                        videos=Videos.insert({title:videoTitle,thumbs:videothumbs,lastUpdated:Date.now()});

                                    }

                                   return videos;
                                }
                                else {
                                    return "error";
                                }
                            }).run()
                        });
                   }) ;
                   return res;
                }

这是一个服务器端方法并返回undefined

如果没有 bindenvironment,使用 bindenvironemnt 会返回错误。

我是否正确使用它,有人可以告诉我我的代码中的修改

【问题讨论】:

  • 你应该在某处调用包装函数,所以你可能需要res()。另外,你得到了什么确切的错误以及你在哪里使用这个getTime函数?
  • 使用 Meteor HTTP.get 同步版本 (docs.meteor.com/#http_call) 而不是 npm 请求,您不需要所有的 Fiber 东西。

标签: meteor meteorite


【解决方案1】:

你需要一个future来返回内部函数的值:

Meteor.methods({
  getTime: function() {
    var future = new Future();
    Meteor.bindEnvironment(function() {
      future.return('Some value');
    });

    return future.wait();
  },
});

查看this Meteorpad 的示例。

【讨论】:

    【解决方案2】:

    如果您使用来自 @saimeunt 评论的建议,那么您的代码可以简化为以下形式:

    服务器:

    Meteor.methods({
      getSite:function(url){
        var site = HTTP.get(url);
        console.log("statusCode =\n " , site.statusCode);
        console.log("content.length =\n ",site.content.length);
        console.log("header =\n ",site.headers);
        $ = cheerio.load(content);
        ...
      }
    })
    

    客户:

    Meteor.call("getSite", "http://www.google.com");
    

    See how it works

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 2020-11-28
      • 2013-12-05
      • 2019-10-03
      • 2018-01-09
      • 1970-01-01
      相关资源
      最近更新 更多