【问题标题】:update is not working mongodb, node.js更新不起作用 mongodb,node.js
【发布时间】:2016-09-28 04:49:50
【问题描述】:

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

我的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;

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

【问题讨论】:

标签: javascript node.js mongodb mongoose-populate


【解决方案1】:

您的更新代码使用原始 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 的用户。

【讨论】:

  • 感谢您的回复。当我写User.update({username: 'example4'}, {name: 'qq', rating: 1}); 时,它并没有改变任何东西。我可以使用该帐户登录,但没有任何变化。
  • 登录 mongo REPL 并检查 db.User.find({username: 'example4'})
  • 当我登录到我的 mongo shell 时,没有可用的用户。当我写 db.users.find({username: 'example4'}) 时,它会显示我的用户,因为我的集合的名称是“用户”。但是,当我在 app.js 中写入 users.update 时,会出现错误提示“users.update 不是函数”。感谢您再次回复。
  • 另外一件有趣的事情,当我在mongo shell中写db.users.update({username: 'example4'})时,它说example4被修改了,但是当我写db.users.find({username: 'example4'})时,没有那个用户名的用户。谢谢。跨度>
  • Mongoose 将模型转换为具有复数形式的集合名称(User->users)。没关系。 db.users.find() 显示所有用户。可能是你用空文档替换它(db.users.update({username: 'example4'}) w/o 第二个参数)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 2018-08-15
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
相关资源
最近更新 更多