1

私はHeroku/Mongolabを使用しています(そしてMongoHQで試しました)。タイトルは私のセットアップを示しています。これが私のpackage.jsonです:

"name": "metatf-web",
"version" : "0.0.3",
"dependencies": {
    "express": "*",
    "ejs": ">=0.4.2",
    "passport": "*",
    "passport-steam": "*",
    "validator": "*",
    "mongoose" : "*",
    "connect-mongo" : "latest",
    "mongodb" : "latest"
}

基本的に、新しいユーザーを作成すると、データベースがデータベース内のユーザーを上書きしますが、たまにしかありません。これが私のユーザーのスキーマです:

/**
 * Module dependencies
 */
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

/**
 * User Schema
 */
module.exports = function() {
  var Users = new Schema({
    steamid : { type: String }
    , regdate : { type: Date, default: Date.now }
    , avatar  : { type: String, default: "none" }
    , isadmin : { type: String, default: "no" }
  });
  mongoose.model("Users", Users);
};

ユーザーがデータベースに存在するかどうかを判断するために使用する関数と、存在しない場合は次の関数を使用します。

var checkIfUserAddToDbIfNot = function(req, res, next) {
  var steamID = req.user;
  require('./controllers/user_controller').get(steamID, function(err, doc) {
    console.log(doc);
    if (!doc) { // User not found
      require('./controllers/user_controller').create(steamID);
      console.log('User added');
    }
  });
  return next();
};

そして私のuser_controller(CRUD):

/**
 * Module dependencies.
 */
 var mongoose = require('mongoose')
   , Users = mongoose.model("Users")
   , user = new Users();

// Create
exports.create = function (steamID) {
  if (steamID == 76561197991291041) { // Add me as an admin for when database resets.
    user.isadmin = 'yes';
  } else {
    user.isadmin = 'no';
  }
  user.steamid = steamID;
  user.save(function (err, callback) {
    if (err) throw err;
    console.log('User ' + user.steamid + ' added');
    console.log('Admin: ' + user.isadmin);
  });
};

// Read
exports.get = function (steamID, fn) {
  Users.findOne({ steamid: steamID }, function (err, doc) {
    if (err) return err;
    if (doc) {
      fn(null, doc);
    } else {
      fn(null, null); // User not found
    }
  });
};

ここで、ユーザーチェック関数が呼び出されます。

app.get('/auth/steam/return',
  passport.authenticate('steam', { failureRedirect: '/' }), checkIfUserAddToDbIfNot, function (req, res) {
    res.redirect('/');
  });

そして最後に、これが私のconnect-mongoのものです:

app.use(express.session({
  secret: 'dont be walmarting',
  store: new MongoStore(sess_conf.db),
  cookie: {
    maxAge: new Date(Date.now() + 1209600000), // DO NOT CHANGE
    expires: new Date(Date.now() + 1209600000) // DO NOT CHANGE
  },
  maxAge : new Date(Date.now() + 1209600000), // DO NOT CHANGE
  expires: new Date(Date.now() + 1209600000) // DO NOT CHANGE
})); 

ここでの助けをいただければ幸いです。ユーザーが上書きされている理由を一生理解することはできません。Connect-Mongoセッションだと思ったので、サイトに新しいユーザーを追加する前にCookieをクリアしようとしましたが、うまくいきませんでした。これを手伝ってくれる人に感謝します。

編集:私はこのすぐ下でPassportセッションを初期化しています:

// Initialize Passport!  Also use passport.session() middleware, to support
// persistent login sessions (recommended).
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
// END APP CONFIG (annotated)
4

1 に答える 1

0

これがあなたの問題だと思います:

var mongoose = require('mongoose')
   , Users = mongoose.model("Users")
   , user = new Users(); // <-- this creates a module variable `user`, but only once                             
                         //     (the first time the file is require()'d)

// Create
exports.create = function (steamID) {

  // ...which is being re-used every time this function is called.
  // Instead, you need to create the new user here:
  var user = new Users;

  if (steamID == 76561197991291041) { // Add me as an admin for when database resets.
    user.isadmin = 'yes';
  } else {
    user.isadmin = 'no';
  }
  user.steamid = steamID;
  user.save(function (err, callback) {
    if (err) throw err;
    console.log('User ' + user.steamid + ' added');
    console.log('Admin: ' + user.isadmin);
  });
};
于 2013-03-22T20:59:45.450 に答える