是的架构验证密码和确认密码不起作用

Pla*_*osu 26 api schema node.js yup insomnia

import * as Yup from 'yup';
import User from '../models/User';

class UserController {
async store(req, res) {
const schema = Yup.object().shape({
  name: Yup.string().required(),
  email: Yup.string()
    .email()
    .required(),
  password: Yup.string()
    .required()
    .min(6),
});

if (!(await schema.isValid(req.body))) {
  return res.status(400).json({ error: 'Validation fails' });
}

const userExists = await User.findOne({ where: { email: req.body.email } });
if (userExists) {
  return res.status(400).json({ error: 'User already exists.' });
}
const { id, name, email, provider } = await User.create(req.body);
return res.json({ id, name, email, provider });
}

async update(req, res) {
const schema = Yup.object().shape({
  name: Yup.string(),
  email: Yup.string().email(),
  oldPassword: Yup.string().min(6),
  password: Yup.string()
    .min(6)
    .when('oldPassword', (oldPassword, field) =>
      oldPassword ? field.required() : field
    ),
  confirmPassword: Yup.string().when('password', (password, field) =>
    password ? field.required().oneOf([Yup.ref('password')]) : field
  ),
});

if (!(await schema.isValid(req.body))) {
  return res.status(400).json({ error: 'Validation fails' });
}

const { email, oldPassword } = req.body;
const user = await User.findByPk(req.userId);
if (user.email !== email) {
  const userExists = await User.findOne({
    where: { email },
  });
  if (userExists) {
    return res.status(400).json({ error: 'User already exists.' });
  }
}

if (oldPassword && !(await user.checkPassword(oldPassword))) {
  return res.status(401).json({ error: 'Password does not match.' });
}

const { id, name, provider } = await user.update(req.body);

return res.json({ id, name, email, provider });
  }  
}
export default new UserController();
Run Code Online (Sandbox Code Playgroud)

在这里它创建一个密码为 123456 的普通用户

在这里它应该可以工作,因为旧密码与创建的用户的密码相同,它应该更新新密码

我想尝试了解如何让他将当前密码理解为 oldpassword 并更新密码

ano*_*ewb 67

试试这个:

import * as Yup from 'yup';

validationSchema: Yup.object({
  password: Yup.string().required('Password is required'),
  passwordConfirmation: Yup.string()
     .oneOf([Yup.ref('password'), null], 'Passwords must match')
});
Run Code Online (Sandbox Code Playgroud)

  • 我将在“passwordConfirmation”中添加“.required()”并删除“null”值。否则,当“passwordConfirmation”字段留空时,表单有效。 (5认同)
  • 目前,当我更改其中一个输入时,仅验证正在更改的输入,这意味着我需要更改两者才能具有正确的状态,有没有什么方法可以在更改输入时强制检查两者? (3认同)
  • @RenanSouza你可以使用 test() 方法代替。```Yup.object({password: Yup.string().required('密码为必填项'), passwordConfirmation: Yup.string() .test('passwords-match', '密码必须匹配', function (value ) { 返回 this.parent.password === 值 }) })``` (3认同)
  • @HammedOyedele 请创建一个帖子而不是评论,以便我们可以对其进行投票,并可能被选为最佳答案。 (3认同)

apr*_*eda 37

我就是这样做的。

yup.object({
  password: yup
    .string()
    .required('Please enter your password.')
    .min(8, 'Your password is too short.'),
  retypePassword: yup
    .string()
    .required('Please retype your password.')
    .oneOf([yup.ref('password')], 'Your passwords do not match.')
});
Run Code Online (Sandbox Code Playgroud)


Ham*_*ele 32

根据@anoNewb 的回答和@Renan 提出的要求,

Yup.object({
  password: Yup.string().required('Password is required'),
  passwordConfirmation: Yup.string()
    .test('passwords-match', 'Passwords must match', function(value){
      return this.parent.password === value
    })
})
Run Code Online (Sandbox Code Playgroud)