2016-05-30 10 views
0

Я создаю многопользовательскую игру, где у меня есть система входа. Я хочу обновить рейтинг моего пользователя, используя db.collection.update(), но он не работает. Нет ошибки, только когда я пишу имя пользователя моего игрока. Он говорит «Неизвестный пользователь». Я пишу это в своем приложении. Кроме app.js у меня есть еще 3 файла для моего пользователя.обновление не работает mongodb, node.js

Мои app.js

var express = require('express'); 
var path = require('path'); 
var cookieParser = require('cookie-parser'); 
var flash = require('connect-flash'); 
var fs = require('fs'); 
var session = require('express-session'); 
var mongo = require('mongodb'); 
var mongoose = require('mongoose'); 

mongoose.connect('mongodb://localhost/loginapp'); 
var db = mongoose.connection; 

var routes = require('./routes/index'); 
var users = require('./routes/users'); 
var User = require('./models/users'); 

// Init App 
var app = express(); 
var server = require("http").Server(app); 


// BodyParser Middleware 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 

// Express Session 
app.use(session({ 
    secret: 'secret', 
    saveUninitialized: true, 
    resave: true 
})); 
    User.getUserByRating(rating, function(err) 
     { 
     if(err) throw err; 
     }); 

    }); 
    })); 

// Connect Flash 
app.use(flash()); 

// Global Vars 
app.use(function (req, res, next) { 
    res.locals.success_msg = req.flash('success_msg'); 
    res.locals.error_msg = req.flash('error_msg'); 
    res.locals.error = req.flash('error'); 
    res.locals.user = req.user || null; 
    console.log(req.user); 
    next(); 
}); 


app.use('/', routes); 
app.use('/users', users); 

User.collection.update(
{ username: "example2" }, 
{ 
    name: "qq", 
    rating: 1 
} 
) 

Мои users.js

var express = require('express'); 
    var router = express.Router(); 
    var passport = require('passport'); 
    var LocalStrategy = require('passport-local').Strategy; 

    var User = require('../models/users'); 

    // Register 
    router.get('/register', function(req, res){ 
     res.render('register'); 
    }); 


    // Login 
    router.get('/login', function(req, res){ 
     res.render('login'); 
    }); 

    //Register User 
    router.post('/register', function(req, res){ 
     var name = req.body.name; 
     var email = req.body.email; 
     var username = req.body.username; 
     var password = req.body.password; 
     var password2 = req.body.password2; 
     var rating = req.body.rating; 

    // Validation 
     req.checkBody('email', 'Email is required').notEmpty(); 
     req.checkBody('email', 'Email is not valid').isEmail(); 
     req.checkBody('username', 'Username is required').notEmpty(); 
     req.checkBody('password', 'Password is required').notEmpty(); 
     req.checkBody('password2', 'Passwords do not match').equals(req.body.password); 

     var errors = req.validationErrors(); 

     if(errors) 
     { 
      res.render('register',{ 
       errors:errors 
      }); 

     } else 
     { 
      var newUser = new User({ 
       name: name, 
       email:email, 
       username: username, 
       password: password, 
       rating: 1000 
      }); 

      User.createUser(newUser, function(err, user){ 
       if(err) throw err; 
       console.log(user); 
      }); 

      req.flash('success_msg', 'You are registered and can now login'); 

      res.redirect('/users/login'); 
     } 
    }); 

    passport.serializeUser(function(user, done) { 
     done(null, user.id); 
    }); 

    passport.deserializeUser(function(id, done) { 
     User.getUserById(id, function(err, user) { 
     done(err, user); 
     }); 
    }); 

    router.post('/login', 
     passport.authenticate('local', {successRedirect:'/', failureRedirect:'/users/login',failureFlash: true}), 
     function(req, res) { 
     res.redirect('/'); 
     });  

    router.get('/logout', function(req, res){ 
     req.logout(); 

     req.flash('success_msg', 'You are logged out'); 

     res.redirect('/users/login'); 
    }); 


    module.exports = router; 

Моя модель (опять users.js, но в другой папке)

var mongoose = require('mongoose'); 
    var bcrypt = require('bcryptjs'); 


    var UserSchema = mongoose.Schema({ 
     username: { 
      type: String, 
      index:true 
     }, 
     password: { 
      type: String 
     }, 
     email: { 
      type: String 
     }, 
     name: { 
      type: String 
     }, 
     rating: 
     { 
      type: Number 
     } 
    }); 

    var User = module.exports = mongoose.model('User', UserSchema); 




    module.exports.createUser = function(newUser, callback){ 
     bcrypt.genSalt(10, function(err, salt) { 
      bcrypt.hash(newUser.password, salt, function(err, hash) { 
       newUser.password = hash; 
       newUser.save(callback); 
      }); 
     }); 
    } 

    module.exports.getUserByUsername = function(username, callback){ 
     var query = {username: username}; 
     User.findOne(query, callback); 
    } 

    module.exports.getUserByRating = function(rating, callback){ 
     User.findOne({ rating : rating}, callback); 
    } 

    module.exports.getUserById = function(id, callback){ 
     User.findById(id, callback); 
    } 

    module.exports.comparePassword = function(candidatePassword, hash, callback){ 
     bcrypt.compare(candidatePassword, hash, function(err, isMatch) { 
      if(err) throw err; 
      callback(null, isMatch); 
     }); 
    } 

Мои index.js

var express = require('express'); 
var router = express.Router(); 

// Get Homepage 
router.get('/', ensureAuthenticated, function(req, res){ 
    res.render('index'); 
}); 

function ensureAuthenticated(req, res, next){ 
    if(req.isAuthenticated()){ 
    return next(); 
    } else { 
     //req.flash('error_msg','You are not logged in'); 
     res.redirect('/users/login'); 
    } 
    } 


    module.exports = router; 

Большое спасибо заранее. Буду благодарен за любую помощь.

+4

слишком длинный. добавьте [mcve], пожалуйста –

ответ

1

Ваш код обновления использует необработанный интерфейс Монго:

User.collection.update(
{ username: "example2" }, 
{ 
    name: "qq", 
    rating: 1 
} 
) 

Этот код заменит документ в целом (все пропущенные областях, как password и т.д., будут потеряны).
Вы можете быть хотите использовать с последующим: {$set: {name: 'qq', rating: 1}}

Или использовать интерфейс мангуста:

User.update({username: 'example2'}, {name: 'qq', rating: 1}); 

Это добавит $set часть автоматически, если вы не укажете safe = false в вашей модели.


Проверьте состояние фактической базы данных, прежде чем начать делать что-либо в вашем коде. Некоторые пользователи не согласуются с вашей схемой модели и могут не иметь пользователя с именем example2.

+0

Спасибо за ваш ответ. Когда я пишу 'User.update ({имя пользователя: 'example4'}, {name: 'qq', rating: 1});' он ничего не меняет. Я могу войти в эту учетную запись, но ничего не меняется. – Ruben

+0

войдите в mongo REPL и проверьте 'db.User.find ({имя пользователя: 'example4'})'. –

+0

При входе в мою оболочку mongo нет пользователя. Он отображает моего пользователя, когда я wirte 'db.users.find ({имя пользователя: 'example4'})', потому что имя моей коллекции - «пользователи». Однако, когда я пишу 'users.update' в моем app.js, появляется сообщение об ошибке« users.update не является функцией ». Спасибо за ваш ответ. – Ruben