通过 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
获取文档并不能保证您更新正确的文档。因为同一个城市可能有多个文档。
不要与user
和User
混淆。您将 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 请求更新猫鼬模式的属性的主要内容,如果未能解决你的问题,请参考以下文章