Json 从Facebook API向Meteor插入数据

Json 从Facebook API向Meteor插入数据,json,mongodb,facebook-graph-api,meteor,Json,Mongodb,Facebook Graph Api,Meteor,下面是从FB图中提取数据的示例。到目前为止,我已经设法从FB中提取数据,但是我不知道如何将其插入MongoDB 目前,来自Facebook的数据呈现如下: {“数据”:[ { “图片”:https://photo.jpg", “id”:“1234”, “创建时间”:“2013-01-01T00:00:00+0000” }, { “图片”:https://photo.jpg", “id”:“12345”, “创建时间”:“2013-01-01T00:00:00+0000” }] } 我创建了一个收

下面是从FB图中提取数据的示例。到目前为止,我已经设法从FB中提取数据,但是我不知道如何将其插入MongoDB

目前,来自Facebook的数据呈现如下:

{“数据”:[
{
“图片”:https://photo.jpg",
“id”:“1234”,
“创建时间”:“2013-01-01T00:00:00+0000”
},
{
“图片”:https://photo.jpg",
“id”:“12345”,
“创建时间”:“2013-01-01T00:00:00+0000”
}]
}

我创建了一个收集电话Photos,并尝试使用
Photos.inser(data)
插入数据。这是我的服务器代码:

 function Facebook(accessToken) {
    this.fb = Meteor.require('fbgraph');
    this.accessToken = accessToken;
    this.fb.setAccessToken(this.accessToken);
    this.options = {
        timeout: 3000,
        pool: {maxSockets: Infinity},
        headers: {connection: "keep-alive"}
    }
    this.fb.setOptions(this.options);
}

Facebook.prototype.query = function(query, method) {
    var self = this;
    var method = (typeof method === 'undefined') ? 'get' : method;
    var data = Meteor.sync(function(done) {
        self.fb[method](query, function(err, res) {
            done(null, res);
        });
    });
    return data.result;
}

Facebook.prototype.getUserData = function() {
    return this.query('me');
}
Facebook.prototype.getPhotos = function() {
    return this.query('/me/photos?fields=picture');
}

Meteor.methods({
    getUserData: function() {
        var fb = new Facebook(Meteor.user().services.facebook.accessToken);
        var data = fb.getUserData();
        return data;
        _.forEach(data.data, function(photo) {
            Photos.insert(photo, function(err) { 
                if(err) console.error(err); 
            });
        });
    }
});
这是我的收藏代码:

Photos = new Meteor.Collection('picture');
现在,MongoDB中没有插入任何内容,我也不知道为什么

有没有想过我做错了什么,或者有没有更好的方法来解决这个问题? 提前谢谢

  • 你把这些照片定义为流星收藏了吗

  • 按原样插入数据可能有效,但我认为您真正想要做的是将每张照片一次插入到集合中。大概是这样的:

    _.forEach(data.data, function(photo) {
        Photos.insert(photo, function(err) { if(err) console.error(err); });
    }
    
  • 如果这仍然不起作用,请尝试在插入数据之前确保您正在从Facebook获取数据


我刚想到它能起作用。非常感谢Dave和emgee的帮助!下面是那些有相同问题的人的代码。另外,如果有更好的方法,请告诉我

服务器代码:

function Facebook(accessToken) {
    this.fb = Meteor.require('fbgraph');
    this.accessToken = accessToken;
    this.fb.setAccessToken(this.accessToken);
    this.options = {
        timeout: 3000,
        pool: {maxSockets: Infinity},
        headers: {connection: "keep-alive"}
    }
    this.fb.setOptions(this.options);
}

Facebook.prototype.query = function(query, method) {
    var self = this;
    var method = (typeof method === 'undefined') ? 'get' : method;
    var data = Meteor.sync(function(done) {
        self.fb[method](query, function(err, res) {
            done(null, res);
        });
    });
    return data.result;
}

Facebook.prototype.getUserData = function() {
    return this.query('me/photos');
}

Meteor.methods({
    getUserData: function() {
        var fb = new Facebook(Meteor.user().services.facebook.accessToken);
        var data = fb.getUserData();
        _.forEach(data.data, function(photo) {
            Photos.insert(photo, function(err) { 
                if(err) console.error(err); 
            });
        });
    }
});

Meteor.publish('picture', function() {
  return Photos.find();
});
收藏:

Photos = new Meteor.Collection('picture');
客户:

Meteor.subscribe('picture');

Template.facebookphoto.helpers({
        pictures: function () {
             return Photos.find();
          }     
});

Template.fbgraph.events({
    'click #btn-user-data': function(e) {
        Meteor.call('getUserData', function(err, data) {
             $('#result').text(EJSON.stringify(data, undefined, 4));
         });
    }
});
HTML模板:

<template name="fbgraph">
    <div id="main" class="row-fluid">
      {{> facebookphoto}}
    </div>

    <button class="btn" id="btn-user-data">Get User Data</button>
    <div class="well">
        <pre id="result"></pre>
    </div>
</template>


<template name="facebookphoto">
  <div class="photos">
    {{#each pictures}}
      {{> photoItem}}
    {{/each}}
  </div>
</template>

<template name="photoItem">
  <div class="photo">
    <div class="photo-content">
      <a href="{{source}}">
       <img class="img-rounded" src="{{picture}}">
      </a>
    </div>
  </div>
</template>

{{>facebookphoto}
获取用户数据
{{{#每张照片}
{{>photoItem}
{{/每个}}

您正在使用自动发布软件包吗?如果没有,您是否从命令行尝试meteor mongo以查看数据是否确实存在但未发布?我已从应用程序中删除了autopublish包。当我运行
Photos.find().count()时从浏览器或
db.Photos.find().count()在命令行中,它们都显示了0的计数。此外,上面列出的Facebook数据是无效的JSON(无结束数组)。这仅仅是一个输入错误,还是您试图插入无效的结果?如果您在Photos.insert中放入回调,它是否会给出错误?是的,这只是JSON中的一个输入错误--很好。我只是尝试在Photos.insert中呈现回调,但没有返回任何结果。另外,为了检查回调是否正确,我添加了
Photos.insert(数据、函数(错误、结果){console.log(错误);})。这看起来正确吗?我将流星收藏中的照片定义为
Photos=new Meteor.Collection('picture')。我相信这是所有需要在收集,但让我知道,如果我错了。我做了您建议插入每张照片的更改,但由于某些原因,它仍然无法拖动。最后,当我运行
db.users.find().pretty()
时,它会返回我的用户信息,因此FBAPI似乎正在工作。我将建立一个github回购协议,并对问题进行编辑,看看这是否有助于澄清我的问题。谢谢我觉得不错。执行插入时是否会出现错误?尝试将console.log(data)放在forEach之前,也放在u.forEach内部,以查看数据是否确实被迭代,是否调用了insert.interest。我刚刚注意到MongoDB正在接收数据,但是它将数据存储为图片,而不是照片。如果我运行
db.picture.find().count()我收到160张照片,但如果我运行
db.photos.find().count()我收到0。看起来我在某个地方把它定义错了…太好了。通过启用“自动发布”使其正常工作。现在只是设置发布/订阅的问题。