【问题标题】:Update a property of a mongoose schema through POST request通过 POST 请求更新猫鼬模式的属性
【发布时间】:2019-04-28 10:37:23
【问题描述】:

我想在用户进行身份验证时更新用户的位置。

city 属性需要在用户 POST API 路由 /login 时更新。

我似乎无法弄清楚如何更新架构,因为我已经在堆栈上尝试了多种解决方案。有人可以帮帮我吗

POST 请求:包含 api 路由 /login

router.post('/login',cors(), async (req, res) => {
try {
const { email, password, city } = req.body;
if (!isEmail(email)) {
  return res.status(400).json({
    errors: [
      {
        title: 'Bad Request',
        detail: 'Email must be a valid email address',
      },
    ],
  });
}
if (typeof password !== 'string') {
  return res.status(400).json({
    errors: [
      {
        title: 'Bad Request',
        detail: 'Password must be a string',
      },
    ],
  });
}
const user = await User.findOne({ email });
if (!user) {
  throw new Error();
}

const userId = user._id;
user.update({
  city: req.user.city
},{
  $set: { 
    "User.city": req.body.city
  }
}, function (err, user) {
    if (err) throw error
    console.log(user)
    console.log("update user complete")
});

const passwordValidated = await bcrypt.compare(password, user.password);
if (!passwordValidated) {
  throw new Error();
}

const session = await initSession(userId);

res
  .cookie('token', session.token, {
    httpOnly: true,
    sameSite: true,
    maxAge: 1209600000,
    secure: process.env.NODE_ENV === 'production',
  })
  .json({
    title: 'Login Successful',
    detail: 'Successfully validated user credentials',
    csrfToken: session.csrfToken,
    token: session.token,
    city : user.city
  });
} catch (err) {
res.status(401).json({
  errors: [
    {
      title: 'Invalid Credentials',
      detail: 'Check email and password combination',
      errorMessage: err.message,
    },
  ],
  });
 }
});

UserSchema:这是用户的猫鼬模式

const mongoose = require('mongoose');
const uniqueValidator = require('mongoose-unique-validator');
const bcrypt = require('bcryptjs');

const UserSchema = new mongoose.Schema({
 email: {
  type: String,
  required: true,
  minlength: 1,
  trim: true,
  unique: true,   //each registered email must be unique
},
 password: {
  type: String,
  required: true,
  minlength: 8,
 },
  city:{
  type: String,
 },

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

【问题讨论】:

    标签: javascript mongodb mongoose mean-stack


    【解决方案1】:

    你应该注意的几件事。

    1. 您应该通过userId 而不是city 获取文档。通过city 获取文档并不能保证您更新正确的文档。因为同一个城市可能有多个文档。
    2. 不要与userUser 混淆。您将 User 作为模型,将 user 作为从数据库返回的对象。
    3. User.city 不正确,您应该只使用 city


    检查以下代码:
    const user = await User.findOne({ email });
    if (!user) {
      throw new Error();
    }
    
    const userId = user._id;
    User.update({ // Use `model` instead returned object.
      _id: userId // Use `_id` instead of `city` to get record.
    },{
      $set: { 
        "city": req.body.city // Only `city`, you should use instead of `User.city`
      }
    }, function (err, user) {
        if (err) throw error
        console.log(user)
        console.log("update user complete")
    });
    

    【讨论】:

    • 谢谢你的anwser先生。我想我被用户和用户弄糊涂了。然后尝试了许多变化,因为我一直使用错误的对象!
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2019-12-05
    • 2011-11-14
    相关资源
    最近更新 更多