用猫鼬更新MongoDB

时间:2018-07-10 07:57:03

标签: node.js mongodb mongoose

我试图在用户登录到应用程序后更新users集合中的字段。但是更新查询根本不起作用。

users.js

var express = require('express');
var router = express.Router();
var User = require('../models/user');
var jwt = require('jsonwebtoken');

router.post('/login', function(req,res,next){
   let promise = User.findOne({email:req.body.email}).exec();

    promise.then(function(doc){
      if(doc) {
        if(doc.isValid(req.body.password)){
           // generate token
           let token = jwt.sign({username:doc.username},'secret', {expiresIn : '3h'});

           setOnlineStatus(doc.username);
        } else {
           return res.status(501).json({message:' Invalid Credentials'});
        }
      } else {
         return res.status(501).json({message:'User email is not registered.'})
      }
    });

    promise.catch(function(err){
      return res.status(501).json({message:'Some internal error'});
    })
})

function setOnlineStatus(username){
   console.log(username); // log the correct username value
   User.update(
      {'username': username},
      {$set: {'status':'Online'}},
   );
}

模型-user.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcrypt');

var schema = new Schema({
    email : {type:String, require:true},
    username: {type:String, require:true},
    password:{type:String, require:true},
    creation_dt:{type:Date, require:true}
});

schema.methods.isValid = function(hashedpassword){
   return  bcrypt.compareSync(hashedpassword, this.password);
}

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

因此,现在的问题是,一旦将请求发送到/login服务,对setOnlineStatus()的调用就不会使用值为'online'的新字段状态更新users集合。 / p>

  

注意:使用其他服务/register的用户已经添加到users集合中。

我是mongodb的新手。因此,请帮助我解决此问题。 谢谢您,答案将不胜感激。

1 个答案:

答案 0 :(得分:1)

您需要在模式中定义status,因为猫鼬在更新其他方式时会忽略它(阅读:option: strict

尝试将status: {type: String}添加到您的架构

update()函数还返回一个查询(读取:Model.update()),除非您通过回调或使用.exec()进行执行,否则查询不会更新

User.update({'username': username}, {$set: {'status':'Online'}}).exec()