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

Update a property of a mongoose schema through POST request

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

属性 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 获取文档并不能保证您更新正确的文档。因为同一个城市可能有多个文档。
  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")
});