更新不起作用 MongoDB,Node.js



我正在创建多人游戏,其中我也有登录系统。我想使用 db.collection.update() 更新用户的评级,但它不起作用。没有错误,只是当我写下播放器的用户名时,它说"未知用户"。我把它写在我的应用程序中,.js。除了应用程序.js我还为我的用户提供了 3 个文件。

我的应用.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
}
)

我的用户.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;

我的模型(再次是用户.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);
        });
    }

我的索引.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;

提前非常感谢。我将不胜感激任何帮助。

您的更新代码使用原始 mongo 接口:

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

此代码将替换您的整个文档(所有遗漏的字段如password等都将丢失)。
您可能希望使用以下: {$set: {name: 'qq', rating: 1}}

或者使用猫鼬界面:

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

如果您未在模型中指定safe = false,它将自动添加$set零件。


开始在代码中执行任何操作之前,请检查实际的数据库状态。有些用户与您的模型架构不一致,并且可能不是具有example2名称的用户。

最新更新