Meteor如何访问服务器和客户端的Facebook Graph Api

Dar*_*ski 3 javascript facebook-graph-api meteor meteor-accounts

accounts-facebook包仅提供logIn和logOut功能.

meteor-fbgraph可以访问服务器端的fbgraph.

facebook-sdk可以在客户端访问fbgraph.

问题是facebook-sdk不使用Accounts-ui提供的任何东西,例如Accounts.onLoginevent或Accounts.ui.config.点击{{> loginButtons}}用户登录后只Meteor.user()注销,facebook-sdk仍然有它的AccessToken并保持登录状态.结果一半的应用程序仍然登录(客户端),一半注销(服务器).

这是我的帐户与FB事件配对的解决方法,但我认为这不是一个合适的解决方案.

Accounts.onLogin(function(){
  FB.login();
  AccountsOnLogout(function(){
    FB.logout();
  });
});

function AccountsOnLogout(callback){
  var waitForLogout = setInterval(function() {
    if (!(Meteor.user())) {
      console.log("logged out");
      callback();
      clearInterval(waitForLogout);
    }
  }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

你有更好的想法如何在客户端获得fbGraph吗?

Rob*_*mon 6

我只为你使用"有点解决方法",因为无论如何我都会在服务器上操作和缓存响应数据.所以我只是调用方法并使用该服务器端.

Facebook = (accessToken) ->
  @fb = Meteor.npmRequire 'fbgraph'
  @accessToken = accessToken
  @fb.setAccessToken @accessToken
  @options =
    timeout: 3000
    pool:
      maxSockets: Infinity
    headers:
      connection: "keep-alive"
  @fb.setOptions @options


FBQuery = (query, method, fbObject) ->
  if typeof method is 'undefined' then method = 'get'
  console.log "query is: " + query
  data = Meteor.sync((done) ->
    fbObject[method](query, (err, res) ->
      done(null, res)
    )
  )
  data.result


Meteor.methods(
  getUserData: ->
    fb = new Facebook(Meteor.user().services.facebook.accessToken)
    FBQuery '/me', 'get', fb

  getUserEvents: ->
    fb = new Facebook(Meteor.user().services.facebook.accessToken)
    FBQuery '/' + Meteor.user().services.facebook.id + '/events', 'get', fb

  getUserGroups: ->
    fb = new Facebook(Meteor.user().services.facebook.accessToken)
    FBQuery '/' + Meteor.user().services.facebook.id + '/groups?fields=name&limit=1000', 'get', fb
)
Run Code Online (Sandbox Code Playgroud)

和客户端

Template.home.events(
  'click #btn-user-data': (e) ->
    Meteor.call('getUserData', (err, data) ->
      $('#result').text(JSON.stringify(data, undefined, 4))
    )
)
Run Code Online (Sandbox Code Playgroud)