将 Facebook 登录和地理位置数据插入 MongoDB

Posted

技术标签:

【中文标题】将 Facebook 登录和地理位置数据插入 MongoDB【英文标题】:Inserting Facebook login and Geolocation data into MongoDB 【发布时间】:2015-05-24 14:27:24 【问题描述】:

我目前正在开展一个项目,其中用户使用 Facebook 登录,查看带有精确位置的地图,然后可以看到也在地图上登录的朋友(距离)。

下一步是将这些数据存储在数据库中。

由于我对使用 MongoDB 还很陌生,因此我想要一些有关如何获取 Facebook 登录/地理位置数据并将其插入数据库的指导。我很乐意从命令行手动将 BSON 对象输入数据库,但我似乎无法在我的代码中找到最好的方法。

代码如下 - 对于获取发布数据并将其放入 MongoDB 数据库的第一步提供一些指导真的很有帮助。谢谢!

var express = require('express')
var passport = require('passport')
var util = require('util')
var FacebookStrategy = require('passport-facebook').Strategy
var logger = require('morgan')
var session = require('express-session')
var sessionStore = require('sessionstore');
var bodyParser = require("body-parser")
var cookieParser = require("cookie-parser")
var methodOverride = require('method-override');
var port = process.env.PORT || 3000
var io = require('socket.io')(http);
var http = require('http').Server(app);
var markers = [];
var server = require('http').createServer(app);
var passportStrategy = require('../utils/passport-strategy');
var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');

var FACEBOOK_APP_ID = "*";
var FACEBOOK_APP_SECRET = "*";

passport.use(passportStrategy.facebook);

passport.serializeUser(function(user, done) 
  done(null, user);
);

passport.deserializeUser(function(obj, done) 
  done(null, obj);
);

var sessionData = session(
  store: sessionStore.createSessionStore(),
  secret: "your_secret",
  cookie:  maxAge: 2628000000 ,
  resave: true,
  saveUninitialized: true
);

passport.use(new FacebookStrategy(
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: "http://localhost:3000/auth/facebook/callback"
  ,
  function(accessToken, refreshToken, profile, done) 

    process.nextTick(function () 

      return done(null, profile);
    );
  
));

var app = express();

  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(sessionData);
  app.use(logger("combined"));
  app.use(cookieParser());
  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded(
    extended: true
  ));
  app.use(methodOverride());
  app.use(session(
      secret: "keyboard cat",
      saveUninitialized: true, // (default: true)
      resave: true, // (default: true)
    ));
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(express.static(__dirname + '/public'));

app.get('/', function(req, res)
  res.render('index',  user: req.user );
);

app.get('/account', ensureAuthenticated, function(req, res)
  res.render('account',  user: req.user );
);

app.get('/login', function(req, res)
  res.render('login',  user: req.user );
);

app.get('/auth/facebook',
  passport.authenticate('facebook'),
  function(req, res)
  );

app.get('/auth/facebook/callback', 
  passport.authenticate('facebook',  failureRedirect: '/login' ),
  function(req, res) 
    res.redirect('/');
  );

app.get('/logout', function(req, res)
  req.logout();
  res.redirect('/');
);

app.get('/mapjs', function(req, res)
  res.sendFile(__dirname + '/public/map.js');
);


// Socket markers start

io.on('connection', function(socket) 
    console.log('a user connected');

    socket.on('marker', function(data) 
      data.socketId = socket.id;
      markers[socket.id] = data;
      console.log('marker latitude: ' + data.lat + ', marker longitude:' + data.lng);
      socket.broadcast.emit('show-marker', data);
    );

    // socket.on('show-marker', )
    socket.on('show-user-location', function(data) 
      socket.broadcast.emit('show-user-location', data);
    );

);

app.listen(port, function()
  console.log('five minute catch up is on port 3000');
);

// socket markers end

function ensureAuthenticated(req, res, next) 
  if (req.isAuthenticated())  return next(); 
  res.redirect('/login')


module.exports = server;

【问题讨论】:

【参考方案1】:

你能把它去掉,这样你就只插入一些静态数据,然后再将它连接到 facebook 并在那里有套接字。每多一点代码都会妨碍您了解您尝试的更改是否真的在做您想要的。

关于在 mongodb 中以编程方式插入数据的最佳方式,我相信这是文档的相关部分:

http://docs.mongodb.org/manual/core/write-operations-introduction/

db.users.insert(
  
    name: "sue",
    age: 26,
    status: "A"
  
)

【讨论】:

以上是关于将 Facebook 登录和地理位置数据插入 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

用户尝试登录时,iOS App 中的 Facebook 集成问题

解析 Facebook 登录不适用于所有设备

用户登录后如何使用社交 API(如 facebook)将数据存储在数据库中

如何在网站中结合facebook登录和本机登录之间的会话

将 Spring Security 与 Facebook 登录集成

让Facebook登录使用Android Webview