我试图在用户登录到应用程序后更新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的新手。因此,请帮助我解决此问题。 谢谢您,答案将不胜感激。
答案 0 :(得分:1)
您需要在模式中定义status
,因为猫鼬在更新其他方式时会忽略它(阅读:option: strict)
尝试将status: {type: String}
添加到您的架构
update()
函数还返回一个查询(读取:Model.update()),除非您通过回调或使用.exec()
进行执行,否则查询不会更新
User.update({'username': username}, {$set: {'status':'Online'}}).exec()