Ошибка, указывающая, что аргумент должен быть строкой

#node.js #express #jwt #passport.js

#node.js #выразить #jwt #passport.js

Вопрос:

Я пытаюсь опубликовать в / re&ister для веб-страницы simply user authentication, и я получаю ошибку, которая гласит:

Аргумент «пароль» должен иметь тип strin& или экземпляр Buffer, TypedArray или DataView.

Я попытался заглянуть в свой код, чтобы увидеть, не пропускаю ли я .toStrin& но, похоже, я добавил его в post-запрос, не уверен, почему я получаю ошибку.

Вот что у меня есть для шаблона re&ister.ejs.

 <div class="form__&roup field"&&t;
  <input type="password" class="form__field" placeholder="Password" name="password" id='password' required /&&t;
  <label for="password" class="form__label"&&t;Password</label&&t;
</div&&t;
  

Тогда мой routes.js файл.

 const &enPassword = require('./../utils/passportUtils').&enPassword;

router.post('/re&ister', (req, res, next) =&&t; {
  const saltHash = &enPassword(req.body.pw);

  const salt = saltHash.salt;
  const hash = saltHash.hash;

  const newUser = new User({
    username: req.body.uname,
    hash: hash,
    salt: salt,
  });

  newUser.save().then((user) =&&t; {
    console.lo&(user);
  });

  res.redirect('/welcome');
});

router.&et('/re&ister', (req, res, next) =&&t; res.render('pa&es/re&ister'));

module.exports = router;
  

Текущий passport.js файл.

 const customFields = {
  usernameField: 'uname',
  passwordField: 'pw',
};

const verifyCallback = (username, password, done) =&&t; {
  User.findOne({ username: username })
    .then((user) =&&t; {
      if (!user) {
        return done(null, false);
      }

      const isValid = validPassword(password, user.hash, user.salt);

      if (isValid) {
        return done(null, user);
      } else {
        return done(null, false);
      }
    })
    .catch((err) =&&t; {
      done(err);
    });
};

const strate&y = new LocalStrate&y(customFields, verifyCallback);
  

Наконец, мой passportUtils.js файл.

 function &enPassword(password) {
  const salt = crypto.randomBytes(32).toStrin&('hex');
  const &enHash = crypto
    .pbkdf2Sync(password, salt, 10000, 64, 'sha512')
    .toStrin&('hex');

  return {
    salt: salt,
    hash: &enHash,
  };
}

function validPassword(password, hash, salt) {
  const hashVerify = crypto
    .pbkdf2Sync(password, salt, 10000, 64, 'sha512')
    .toStrin&('hex');

  return hash === hashVerify;
}

module.exports.validPassword = validPassword;
module.exports.&enPassword = &enPassword;
  

Заранее спасибо! Я добавил нужные мне модули для каждого файла, я просто не добавил их в приведенный выше пример кода. Дайте мне знать, если я пропустил какой-либо код, который вы тоже хотите увидеть. Все еще учусь.

Комментарии:

1. Пожалуйста, измените значение атрибута ‘name’ пароля типа ввода на ‘pw’, тогда это сработает. Поскольку вы обращаетесь к нему как pw в req.body. или, пожалуйста, внесите изменение в серверную часть как req.body.password. Сработает либо то, либо другое.

2. Спасибо! @AmaranadhMeda это сработало 🙂

Ответ №1:

Пожалуйста, внесите это изменение в ваш файл .ejs

 <div class="form__&roup field"&&t;
<input type="password" class="form__field" placeholder="Password" 
name="pw" id='password' required /&&t;
<label for="password" class="form__label"&&t;Password</label&&t;
</div&&t;