检查以下代码:
我想在用户进行身份验证时更新用户的位置。
当用户POST API路由/登录时,需要更新属性city
。
我似乎不知道如何更新模式,因为我已经在堆栈上尝试了多种解决方案。有人能帮我一下吗
POST请求:保持api路由/登录
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);
您应该注意的几件事。
- 您应该通过
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")
});