简体   繁体   中英

update is not working mongodb, node.js

I am creating multiplayer game, where I have login system as well. I want to update my user's rating using db.collection.update() , but it is not working. There is no error, just when I write username of my player It says "Unknown User" . I write it in my app.js. Besides app.js I have 3 more files for my user.

My 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
}
)

My 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;

My model(again users.js, but in another folder)

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);
        });
    }

My 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;

Thanks a lot in advance. I will be grateful for any help.

Your update code uses raw mongo interface:

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

This code replace your document as whole(all missed fields like password and etc will be lost).
You may be want to use followed: {$set: {name: 'qq', rating: 1}}

Or use mongoose interface:

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

It will add $set part automatically, if you don't specify safe = false in your model.


Check actual database state before you start to do anything in your code. There are some users incosistent with your model schema, and may be no user with example2 name.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM