通过 POST 请求更新猫鼬模式的属性

Posted

技术标签:

【中文标题】通过 POST 请求更新猫鼬模式的属性【英文标题】:Update a property of a mongoose schema through POST request 【发布时间】: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);

【问题讨论】:

【参考方案1】:

你应该注意的几件事。

    您应该通过userId 而不是city 获取文档。通过city 获取文档并不能保证您更新正确的文档。因为同一个城市可能有多个文档。 不要与userUser 混淆。您将 User 作为模型,将 user 作为从数据库返回的对象。 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先生。我想我被用户和用户弄糊涂了。然后尝试了许多变化,因为我一直使用错误的对象!

以上是关于通过 POST 请求更新猫鼬模式的属性的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬使用方法将模式添加到模式中

在猫鼬中,如果我正在创建一个包含 4 个字段的模式。但我只保存两个字段的值。如何更新未给出的字段值?

更新混合类型的猫鼬嵌套数组

通过 id 集更新多个文档。猫鼬

一次更新猫鼬中的多个文档

NodeJS-ExpressJS 猫鼬 API POST 请求与外键